10

我有一个 winforms 应用程序,我在其中使用 2 个表单来显示所有必要的控件。第一个表单是一个启动屏幕,它告诉用户它正在加载等。所以我使用以下代码:

Application.Run( new SplashForm() );

应用程序完成加载后,我希望 SplashForm 隐藏或将我发送到后面并显示主要来源。我目前正在使用以下内容:

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

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

我看到的是 MainForm 已显示,但 SplashForm 仍然在“顶部”可见。我目前正在做的是单击 MainForm 以手动将其置于前面。关于为什么会发生这种情况的任何想法?

4

4 回答 4

22

可能您只想关闭启动表单,而不是将其发送回。

我在一个单独的线程上运行启动表单(这是 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();
        splashForm = null;
    }
...
}

主程序功能如下所示:

[STAThread]
static void Main(string[] args)
{
    SplashForm.ShowSplashScreen();
    MainForm mainForm = new MainForm(); //this takes ages
    SplashForm.CloseForm();
    Application.Run(mainForm);
}
于 2009-02-04T10:19:48.050 回答
5

这对于防止您的启动画面在关闭后窃取您的焦点并将您的主窗体推到后台至关重要:

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

将此添加到您的初始表单类。

于 2009-11-05T19:10:42.580 回答
2

如果我理解正确,您应该只在主窗体上使用 Application.Run 。所以要么先显示你的飞溅,只需使用类似的东西:

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

然后随时在 MySplash 中手动关闭它。

或者在你的主窗体中显示它 Load 事件处理程序,然后等待它关闭或其他任何东西,直到你让 Load 方法完成。(可能在显示之前将 Visible 设置为 false,然后再将其设置为 true。

于 2009-02-04T10:24:55.373 回答
1

我相信这可能是我当前设计的设计缺陷!

我认为实现我需要的最好方法是从 MainForm 控制一切。所以我可以使用:

Application.Run(new MainForm());

这将负责显示/更新/隐藏 SplashScreen。通过这种方式,我可以对 MainForm 管理的系统的其余部分进行必要的复杂操作。

于 2009-02-04T11:20:45.167 回答