首页 > 解决方案 > 第一个表格不关闭,第二个不打开

问题描述

我想要一个欢迎表单,名为 StartForm。这会关闭,然后打开我的 MenuForm。

当前的问题是:第一个保持打开状态,不关闭以显示第二个。

我尝试了几件事,比如简单地显示和隐藏它们。我现在尝试 Application.run 然后隐藏它。不幸的是,它保持开放。并且没有 Application.run 第二种形式。

    static void Main()
    {
        Form StartForm = new Main();
        MForm MenuForm = new MForm();
        Application.Run(StartForm);
        //
        Task.Delay(500).ContinueWith((t) =>
        {
            StartForm.Hide();
            Application.Run(MenuForm);
        });
        }

我希望这会在等待延迟后关闭第一个表单,但它保持打开状态。

标签: c#formswinforms

解决方案


调用Application.Run()会导致新的应用程序消息循环开始在当前线程上运行。Application.Run()如果在第一个应用程序运行时进行后续调用,则InvalidOperationException根据docs抛出一个。但是,在您的情况下这实际上是不可能的,因为您的调用Application.Run()是在 UI 线程上调用的,这会阻止任何后续代码的执行,直到它退出。

相反,我们需要通过使用来引导应用程序Application.Run(new Main()),然后在Main表单内部我们将处理显示和隐藏行为。

以下是我建议实现这一目标的方法:

首先,在您的Main方法中,将所有内容替换为Application.Run(new Main());.

然后在您的Main表单内部创建一个如下所示的方法:

private void Main_Shown(Object sender, EventArgs e)
{
    Task.WaitAll(Task.Delay(500));
    this.Hide();
    var menuForm = new MForm();
    menuForm.Closed += (obj, args) => { this.Show(); };
    menuForm.Show();
}

最后,进入您的Main.Designer.cs文件并确保将Shown事件订阅到Main_Shown您刚刚在方法中创建的InitializeComponent方法,如下所示:

this.Shown += new System.EventHandler(this.Main_Shown);

解释这里发生了什么:

根据文档Form.Shown第一次向用户显示表单时会触发事件。这对于这个用例来说是完美的,所以我们“挂钩”到它并通过等待 500 毫秒的延迟来响应它。

之后我们隐藏当前的 ( Main) 表单,创建新的 ( MForm) 表单并显示它。但更重要的细节是我们订阅了表单的Closed事件,以便当它被用户关闭时,Main表单会再次显示自己。


推荐阅读