第一个表格未关闭,第二个表格未打开

时间:2019-03-25 23:32:11

标签: c# forms winforms

我想要一个欢迎的表格,叫做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);
        });
        }

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

2 个答案:

答案 0 :(得分:2)

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

相反,我们需要使用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);

这里发生的情况的说明:

根据docsForm.Shown事件在第一次向用户显示表单时被触发。这对于此用例来说是完美的,因此我们“挂入”它并通过等待500毫秒的延迟来对此做出响应。

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

答案 1 :(得分:0)

使用计时器在Firstform中打开Second表单 并在显示Secondform后隐藏Firstform。

像这样

主要

static void Main()
{
    Form StartForm = new Main();
    Application.Run(StartForm);
}

FirstForm

设置间隔为5000的计时器并启用它。

private void timer1_Tick(object sender, EventArgs e)
{
    MForm MenuForm = new MForm();
    this.Hide();
    MenuForm.Show();
    timer1.Stop();
}