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

在我的应用程序中,我想先显示一个登录表单,然后是主表单,如果登录成功的话。目前我是这样做的:

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

但后来我开始想知道—— Application.Run()的意义何在?为什么不干脆也做 (new MainForm()).ShowDialog()呢?有什么区别吗?那怎样才能达到我的目的呢?

65530 次浏览

Application.Run()是应用程序的开始,而 MainForm是应用程序的一部分,MainForm()).ShowDialog()只用于显示它。

Application.Run()是您的应用程序的 entry point。与某些类的 Main()方法或 WebApplication 的 ApplicationStart()方法相同

Run () 有不同的重载,其中一个重载没有参数。

来自 MSDN:

此方法将事件处理程序添加到 对象的 mainForm 参数 事件处理程序调用 退出线程来清除 申请。

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

一个关键的区别是 ShowDialog 通常是一个模态对话框。如果希望创建用户友好的工具集,则不希望它由模态对话框组成。

此外,Application.Run ()不仅接受表单,还有一些重载。

至于你的申请,我认为没什么关系。申请。运行对我来说很有意义,因为它表示实际应用程序的开始。

Application.Run(Form)在当前线程上启动一个消息循环,并显示指定的表单。消息循环使表单能够接收 Windows 消息(例如,按键、鼠标单击、绘制失效) ,使其看起来响应性强,并与用户进行交互。当您在 Form实例上调用 ShowDialog()时,它实际上执行了类似的操作,并为调用 ShowDialog的表单创建了一个模态消息循环。

这两个调用之间没有太大区别。Application.Run确实添加了一些额外的事件处理,使您能够在关闭主窗体时对资源进行一些整理(参见 应用程序)。

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

new Form().Show();
new Form().Show();
Application.Run();

您无法使用 ShowDialog()方法实现这一点,因为其中一个表单必须是模态的。


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

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

另一种方法是自己完成管道工作,如果登录成功,则在 LoginForm的结束事件中打开 MainForm的一个实例。

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

何时申请。如果使用 Run,窗体的 Close 按钮(红色 X)将返回 DialogResult。但是,当使用 ShowDialog 时,Close 按钮将生成 DialogResult。取消。

这跟你有关系吗?在我的代码中,我测试的是 DialogResult。取消以确定应用程序的退出代码。当红色 X 用于关闭窗体时,它被破坏。现在测试 DialogResult.OK 以指示成功退出。

        return myForm.DialogResult == DialogResult.OK ? 0 : 1;

超载文件

public static void Run(
ApplicationContext context );

有一个简洁的例子与不同的方法,涉及两种形式。

以下是一个更具体的差异例子:

如果您的主窗体是 MDI 窗体,那么单击关闭按钮(右上角的‘ x’,或 Alt-F4)的行为会有所不同,这取决于您使用哪种方法来显示窗体。

使用 Application.Run(mainForm)时,将运行子窗体的关闭事件,然后运行主窗体的关闭事件。

使用 mainForm.ShowDialog时,主窗体的关闭事件将运行,而子窗体的关闭事件不会运行。

从我的测试中,我注意到使用 Application。与 ShowDialog 相比,使用 DialogResult 的运行按钮不会关闭窗体(OnFormCclose 不会命中) ,在 ShowDialog 中,使用 DialogResult 的按钮会命中 OnFormCclose 并关闭窗体。