2011-06-07 196 views
4

我需要有一個PNG(帶有透明度)作爲初始屏幕。圖像的透明部分應該清晰,以便用戶可以看到它後面的任何窗口(或桌面)。WPF初始屏幕窗口

我還需要顯示啓動畫面5秒(合同特別說5秒),它不能更短。我知道VS 2010中的構建屬性,但啓動畫面來得太快(少於5秒)。

我能做些什麼,使之叉5秒(約)

+3

怎麼樣了Thread.Sleep(5000);? :) – Reniuz 2011-06-07 17:08:22

+0

對於透明的PNG,您需要類似Photoshop或Illustrator的東西來保存Alpha通道信息。 – Stonetip 2011-06-07 17:10:27

+0

至於啓動畫面,您可能需要添加某種自定義彈出窗口。如果用戶可以點擊複選框而不必再次顯示它,那將會很好。但我懷疑合同會允許!似乎太多的公司寧願疏遠用戶,只要他們的營銷。 – Stonetip 2011-06-07 17:12:30

回答

4

我有一個類似的問題,我無法使用內置的splashscreen選項,在WPF項目上。

該項目現在是開源的,你看看這裏:https://code.google.com/p/theomniscientchimp/

這是一個自動更新(有你不需要我猜幾樣東西)。

這是你應該需要最低:

WPF的一面:

<Window x:Class="TheOmniscientChimp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:CustomXaml" 
     Icon="SC2_Replay_Monkey.ico" 
     Title="MainWindow" Height="256" Width="456" Background="#00005555" AllowsTransparency="True" WindowStyle="None" WindowStartupLocation="CenterScreen" > 
     <Grid Width="Auto"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*" />   
     </Grid.RowDefinitions> 
     <Image Name="splashScreenImage" Stretch="Fill" Grid.Row="0" /> 
    </Grid> 
</Window> 

C#側(代碼後面):

/// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      BitmapImage splashScreenImageSource = new BitmapImage(); 
      splashScreenImageSource.BeginInit(); 
      splashScreenImageSource.UriSource = new Uri("Your_Image.png", UriKind.Relative); 
      splashScreenImageSource.EndInit(); 

      splashScreenImage.Source = splashScreenImageSource; 
     } 

     public void AsynchronousExit() 
     { 
      BackgroundWorker worker = new BackgroundWorker(); 
      worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
      worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); 
      worker.RunWorkerAsync(); 
     } 

     private void worker_DoWork(object sender, DoWorkEventArgs e) 
     { 
      //Makes the thread wait for 5s before exiting. 
      Thread.Sleep(5000); 
     } 

     private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      Environment.Exit(0); 
     } 
    } 

告訴我,如果你需要幫助的調整。

FB。

+0

此代碼是否與MailApplication一起使用,還是創建新的WPF窗口並將代碼(XAML/C#)添加到新窗口? – 2011-06-08 17:31:41

+0

Mail = Main。這是一個錯字 – 2011-06-08 19:01:51

+0

我是在一個單獨的項目中製作的,但您可以將它放在主應用程序中,並在應用程序啓動之前調用它。 – 2011-06-14 11:47:58

0

你可能不得不做一些類似你在的WinForms做什麼東西。啓動一個新線程並在該線程上啓動一個Wpf應用程序。在WinForms中,您可以通過使用System.Windows.Forms.Application.Run(new SplashForm())來完成此操作;在Wpf中應該類似於這個。

編輯: 我發現這個,所以它應該工作。 http://msdn.microsoft.com/en-us/library/ms597011.aspx

關鍵是要在一個單獨的線程上做到這一點。應用程序啓動的線程已經綁定到一個WPF應用程序,並且您希望您的splash基本上成爲它自己的GUI。然後,表單可以有一個計時器,使其自動關閉,這應該會自動終止這個其他應用程序。

5

如果我不得不這樣做,我會添加一個窗口,並設置其屬性AllowsTransparency = true;將其設置爲加載此之前,各種形式的我的意思是之前啓動可以通過修改App.xml來完成,並設置Startup="Application_Startup 要禁用你有頂部defauld控制設置WindowStyle = none 而且在其代碼

private void Application_Startup(object sender, StartupEventArgs e) 
     { 
      MainWindow mn = new MainWindow(); 
      mn.ShowDialog();   
     } 

使用定時器做你想做什麼都

private DispatcherTimer timer; 
timer = new DispatcherTimer(); 
      timer.Tick += new EventHandler(timer_Tick); 
      timer.Interval = TimeSpan.FromMilliseconds(5000); 
      timer.IsEnabled = true; 

void timer_Tick(object sender, EventArgs e) 
     { 
///Close your window here 
} 

希望這有助於

1

我有同樣的問題,的擊打它實際上是令人驚訝容易解決沒有什麼特別的東西:

  1. 中添加圖片到主項目,並設置構建屬性爲閃屏。

  2. 的InitializeComponents()調用前添加一個Thread.sleep代碼(5000)到構造你的應用程序的主窗口。

這會耽誤你的主WPF窗口的加載和啓動畫面會熬夜至少加載時間+睡眠時間的主窗口彈出和飛濺消失之前。

0

如果你想使用一個啓動畫面窗口,使用後臺工作,你讓你的主代碼更復雜,因爲它是沒有必要的。解決方案是在主UI線程中將主代碼作爲正常的同步代碼樣式編寫,同時顯示啓動窗口,直到關閉它爲止,並且可以發送更新以更改啓動屏幕加載文本或進度條。

SplashWindow window = null; 


var thread = new Thread(new ThreadStart(() => 
{ 
    Debug.Print("Thread begin"); 
    window = new SplashWindow(); 
    window.ShowDialog(); 
})); 

thread.Name = "RunSplashWindow"; 
thread.SetApartmentState(ApartmentState.STA); 
thread.IsBackground = true; 
thread.Start(); 

Debug.Print("App begin"); 

Thread.Sleep(1000); 

if (window != null) 
{ 
    window.Dispatcher.BeginInvoke(new Del(() => { 
     window.SetHeader("Running..."); 
    }), new object[0]); 
} 

Thread.Sleep(1000); 

for (int i = 1; i <= 100; i++) 
{ 
    if (window != null) 
     { 
      window.Dispatcher.BeginInvoke(new Del(() => 
      { 
      window.SetProgress((double)i); 
     }), new object[0]); 
    } 

    Thread.Sleep(10); 
} 

Thread.Sleep(1000); 

Debug.Print("App end"); 

if (window != null) 
{ 
    window.Dispatcher.BeginInvoke(new Del(() => 
    { 
     window.Close(); 
    }), new object[0]); 
}