c# - 第一个表格不关闭,第二个不打开
问题描述
我想要一个欢迎表单,名为 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);
});
}
我希望这会在等待延迟后关闭第一个表单,但它保持打开状态。
解决方案
调用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
表单会再次显示自己。
推荐阅读
- python-3.x - 在使用 python 库 random_word 制作这个随机密码生成器时,elif 语句中的“随机词”有时会返回“无”
- serilog - 设置 Serilog 滚动文件的最大值
- javascript - 内联 SVG css 动画在 Safari 上不起作用
- android - Android Paging 3 与房间
- php - 用于测试的 Symfony 模拟存储库
- javascript - 与从其 API 获取的数据相比,github 提交活动图如何显示不同的颜色
- objective-c - iOS:框架依赖
- token - Flow Blockchain Fungible Token 在交易所
- c# - 我无法在 azure bot 默认答案中以超链接的形式编写文本,该机器人在 MS 团队中工作,但它只显示文本
- flutter - 主类中的错误:对空值使用空检查运算符