在我的应用程序中,我想首先显示登录表单,如果登录成功则显示主表单。目前我正在做这样的事情:
var A = new LoginForm();
if ( A.ShowDialog() == DialogResult.OK )
Application.Run(new MainForm());
但后来我开始想 -
Application.Run()
有什么意义?为什么不直接做(new MainForm()).ShowDialog()
呢?有什么不同?实现我想要的目标的正确方法是什么?
Application.Run(Form)
在当前线程上启动消息循环并显示指定的表单。消息循环使窗体能够接收Windows 消息(例如,按键、鼠标单击、绘制失效),以使其表现出响应能力并与用户进行交互。当您在 ShowDialog()
实例上调用 Form
时,它实际上会执行类似的操作,并为调用 ShowDialog
的表单创建模式消息循环。
两次调用没有太大区别。
Application.Run
确实添加了一些额外的事件处理,使您能够在主窗体关闭时对资源进行一些整理(请参阅Application.ThreadExit)。
启动 WinForms 应用程序的推荐方法是使用
Application.Run
,但我怀疑这更多的是一种约定而不是规则。使用 Application.Run
的最大原因是如果您想打开多个非模态表单。您可以使用以下方法执行此操作:
new Form().Show();
new Form().Show();
Application.Run();
您无法使用
ShowDialog()
方法来实现此目的,因为其中一种形式必须是模态的。
至于您的问题如何显示登录表单,然后在登录成功后显示主表单,我认为您所拥有的很好:
if (new LoginForm().ShowDialog() == DialogResult.OK)
{
Application.Run(new MainForm());
}
另一种方法是自己进行管道操作,如果登录成功,则在
MainForm
的关闭事件中打开 LoginForm
的实例。
从我的测试中,我注意到这个主要区别:
当使用Application.Run时,表单的关闭按钮(红色X)返回DialogResult.None;但是,当使用 ShowDialog 时,“关闭”按钮会生成 DialogResult.Cancel。
这对你来说重要吗?在我的代码中,我正在测试 DialogResult.Cancel 以确定应用程序的退出代码。当使用红色 X 关闭表单时,这种情况就被打破了。我现在测试 DialogResult.OK 以指示成功退出。
return myForm.DialogResult == DialogResult.OK ? 0 : 1;
来自 MSDN:
此方法添加一个事件处理程序 Closed 的 mainForm 参数 事件。事件处理程序调用 ExitThread 来清理 申请。
一个主要区别是 ShowDialog 通常是模式对话框。如果您想创建一个用户友好的工具集,您不会希望它由模式对话框组成。
此外,Application.Run() 接受的不仅仅是一个表单。它有一些过载。
至于你的申请,我认为这并不重要。 Application.Run 对我来说很有意义,因为它表示实际应用程序的开始。
Application.Run()
用于启动应用程序,而 MainForm
是应用程序的一部分,MainForm()).ShowDialog()
仅用于显示它。
Application.Run()
是您的应用程序的 entry point
。与 Main()
方法相同用于某些类或 ApplicationStart()
用于 Web 应用程序
Application.Run() 有不同的重载,其中之一是不带参数的。该方法无需初始表单即可启动应用程序。
更具体的差异示例:
如果您的主窗体是 MDI 窗体,则单击关闭按钮(右上角的“x”或 Alt-F4)的行为会有所不同,具体取决于您用于显示窗体的方法。
使用
Application.Run(mainForm)
,子窗体的关闭事件运行,然后主窗体的关闭事件运行。
使用
mainForm.ShowDialog
,主窗体的关闭事件运行,子窗体的关闭事件不运行。
从我的测试中我注意到,与 ShowDialog 相比,使用带有 DialogResult 的 Application.Run 按钮不会关闭表单(未点击 OnFormClosing),其中带有 DialogResult 的按钮点击 OnFormClosing 并关闭表单。