2009-02-04 74 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; } 
} 

一下添加到您飞溅窗体类。