在我的应用程序中,我想首先显示登录表单,然后在登录成功后显示主表单。目前我正在做这样的事情:
var A = new LoginForm();
if ( A.ShowDialog() == DialogResult.OK )
Application.Run(new MainForm());
但后来我开始疑惑 - Application.Run()
有什么意义?为什么不做(new MainForm()).ShowDialog()
呢?有什么不同?什么是实现我想要的正确方法?
答案 0 :(得分:64)
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
的实例。
答案 1 :(得分:5)
来自MSDN:
此方法添加一个事件处理程序 Closed的mainForm参数 事件。事件处理程序调用 ExitThread来清理 应用
答案 2 :(得分:5)
从我的测试中,我注意到了这个主要区别:
使用Application.Run时,表单的“关闭”按钮(红色X)返回DialogResult.None;但是,使用ShowDialog时,“关闭”按钮会生成DialogResult.Cancel。
这对你有用吗?在我的代码中,我正在测试DialogResult.Cancel以确定我的应用程序的退出代码。当红色X用于关闭表格时,这被打破了。我现在测试DialogResult.OK以表示成功退出。
return myForm.DialogResult == DialogResult.OK ? 0 : 1;
答案 3 :(得分:2)
一个关键的区别是ShowDialog通常是一个模态对话框。如果您想创建一个用户友好的工具集,您不希望它由模态对话框组成。
此外,Application.Run()不仅仅接受表单。它有一些重载。
至于你的申请,我认为这不重要。 Application.Run对我有意义,因为它表示实际应用程序的开始。
答案 4 :(得分:2)
public static void Run(
ApplicationContext context );
有一个简洁的例子,其中包含两种形式的不同方法。
答案 5 :(得分:2)
有关差异的更为遗憾的例子:
如果您的主表单是MDI表单,则单击关闭按钮(右上角的“x”或Alt-F4)的行为会有所不同,具体取决于您使用哪种方法显示表单。
使用Application.Run(mainForm)
运行子窗体的结束事件,然后运行主窗体的关闭事件。
使用mainForm.ShowDialog
时,将运行主窗体的结束事件,并且不会运行子窗体的关闭事件。
答案 6 :(得分:1)
Application.Run()
用于应用程序的开始,而MainForm
是应用程序的一部分,而MainForm()).ShowDialog()
仅用于显示它。
Application.Run()
是您的应用的entry point
。与Main()
方法相同,适用于某些类,或ApplicationStart()
适用于WebApplication
Application.Run()有不同的重载,其中一个没有参数。该方法在没有初始表单的情况下启动应用程序。
答案 7 :(得分:0)
从我的测试中我注意到,使用带有DialogResult的Application.Run按钮不会关闭表格(OnFormClosing没有被击中)与ShowDialog比较,其中带有DialogResult的按钮点击OnFormClosing并关闭表单。