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

时间:2010-02-22 21:52:22

标签: c# winforms

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

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

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

8 个答案:

答案 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来清理   应用

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

答案 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)

documentation of the overload

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并关闭表单。