我想要一个欢迎的表格,叫做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);
});
}
我希望它在等待延迟后能够关闭第一个表单,但是它保持打开状态。
答案 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);
这里发生的情况的说明:
根据docs,Form.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();
}