Application.Run()和Form.ShowDialog()之间有什么区别?

Vil*_*lx- 70 c# winforms

在我的应用程序中,我想首先显示登录表单,然后在登录成功时显示主表单.目前我正在这样做:

var A = new LoginForm();
if ( A.ShowDialog() == DialogResult.OK )
    Application.Run(new MainForm());
Run Code Online (Sandbox Code Playgroud)

但后来我开始疑惑 - 这有什么意义Application.Run()呢?为什么不做(new MainForm()).ShowDialog()呢?有什么不同?什么是实现我想要的正确方法?

adr*_*nks 66

Application.Run(Form)在当前线程上启动消息循环并显示指定的表单.消息循环使表单能够接收Windows消息(例如,按键,鼠标点击,绘制失效),以使其显示响应并与用户进行交互.当你调用ShowDialog()一个Form实例时,它实际上做了类似的事情,并为ShowDialog已调用的表单创建一个模态消息循环.

两个电话之间没有太大区别.Application.Run确实添加了一些额外的事件处理,使您可以在主窗体关闭时进行一些资源整理(请参阅Application.ThreadExit).

启动WinForms应用程序的推荐方法是使用Application.Run,但我怀疑这更像是一个约定而非规则.使用的最大原因Application.Run是如果要打开多个非模态表单.你可以这样做:

new Form().Show();
new Form().Show();
Application.Run();
Run Code Online (Sandbox Code Playgroud)

您无法使用该ShowDialog()方法实现此目的,因为其中一个表单必须是模态的.


关于如何显示登录表单的问题,然后如果登录成功则显示主表单,我认为你有什么好处:

if (new LoginForm().ShowDialog() == DialogResult.OK)
{
    Application.Run(new MainForm());
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是自己进行管道工作,并在登录成功MainForm的结束事件中打开一个实例LoginForm.


BFr*_*ree 5

来自MSDN:

此方法将事件处理程序添加到Closed事件的mainForm参数.事件处理程序调用ExitThread来清理应用程序.

http://msdn.microsoft.com/en-us/library/ms157902.aspx

  • 这是唯一值得注意的区别吗?我检查了Reflector,似乎在幕后还有很多事情要发生,这取决于哪一个被调用.肯定有一些更微妙的差异,虽然我不能说什么 - 反映的代码是相当神秘的. (7认同)

小智 5

从我的测试中,我注意到了这个主要区别:

使用Application.Run时,表单的"关闭"按钮(红色X)返回DialogResult.None; 但是,使用ShowDialog时,"关闭"按钮会生成DialogResult.Cancel.

这对你很重要吗?在我的代码中,我正在测试DialogResult.Cancel以确定我的应用程序的退出代码.当红色X用于关闭表格时,这被打破了.我现在测试DialogResult.OK以表示成功退出.

        return myForm.DialogResult == DialogResult.OK ? 0 : 1;
Run Code Online (Sandbox Code Playgroud)