2009-02-04 122 views
8

我有一個winforms應用程序,其中我使用2個窗體來顯示所有必要的控件。第一種形式是一個閃屏中,它會告知其加載等,所以我使用下面的代碼的用戶:C#winforms啓動(Splash)窗體不隱藏

Application.Run(new SplashForm()); 

一旦應用程序加載完成我想要的SplashForm隱藏或我送到後面和主要從顯示。我目前使用下列內容:

private void showMainForm() 
{ 
    this.Hide(); 
    this.SendToBack(); 

    // Show the GUI 
    mainForm.Show(); 
    mainForm.BringToFront(); 
} 

我所看到的是,在MainForm中顯示,但SplashForm仍然是「在上面」可見。我目前正在做的是單擊MainForm手動將其帶到前面。任何想法爲什麼發生這種情況?

回答

20

也許你只是想關閉飛濺窗體,而不是發回它。

我運行一個單獨的線程飛濺形式(這是類SplashForm):

class SplashForm 
{ 
    //Delegate for cross thread call to close 
    private delegate void CloseDelegate(); 

    //The type of form to be displayed as the splash screen. 
    private static SplashForm splashForm; 

    static public void ShowSplashScreen() 
    { 
     // Make sure it is only launched once. 

     if (splashForm != null) 
      return; 
     Thread thread = new Thread(new ThreadStart(SplashForm.ShowForm)); 
     thread.IsBackground = true; 
     thread.SetApartmentState(ApartmentState.STA); 
     thread.Start();   
    } 

    static private void ShowForm() 
    { 
     splashForm = new SplashForm(); 
     Application.Run(splashForm); 
    } 

    static public void CloseForm() 
    { 
     splashForm.Invoke(new CloseDelegate(SplashForm.CloseFormInternal)); 
    } 

    static private void CloseFormInternal() 
    { 
     splashForm.Close(); 
    } 
... 
} 

和主要程序的功能是這樣的:

[STAThread] 
static void Main(string[] args) 
{ 
    SplashForm.ShowSplashScreen(); 
    MainForm mainForm = new MainForm(); //this takes ages 
    SplashForm.CloseForm(); 
    Application.Run(mainForm); 
} 
+0

如果SplashForm是WPF窗口,此方法不起作用 – MrEdmundo 2009-04-08 09:59:23

+1

我僅將它用於WinForms,對不起。 – Grzenio 2009-09-21 09:08:46

2

如果我理解正確的,你應該只在您的主窗體上使用Application.Run。所以,要麼只是通過使用類似第一顯示您的色斑:

using(MySplash form = new MySplash()) 
    form.ShowDialog(); 

,然後手動關閉它在MySplash每當你想。

或者在你的主窗體中顯示它加載事件處理程序,然後等待它關閉,或者直到你完成Load方法。你看它之前,回到真實的之後(可能visible設置爲false。

1

我相信,這可能是我目前的設計中的設計缺陷!

我認爲最好的方式來實現我需要的是。有一切從MainForm的controled所以我可以使用:

Application.Run(new MainForm()); 

這一操作將是RESPONSABLE爲顯示/更新/隱藏閃屏這樣我可以有必要的複雜intactions與管理的系統的其餘部分。 MainForm。

4

這是至關重要的,以防止閃屏竊取你的注意力,推動你的主要形式爲背景,關閉後:

protected override bool ShowWithoutActivation { 
    get { return true; } 
} 

一下添加到您飛濺窗體類。