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

问题描述 投票:0回答:8

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

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

但后来我开始想 -

Application.Run()
有什么意义?为什么不直接做
(new MainForm()).ShowDialog()
呢?有什么不同?实现我想要的目标的正确方法是什么?

c# winforms
8个回答
78
投票

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
的实例。


6
投票

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

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

这对你来说重要吗?在我的代码中,我正在测试 DialogResult.Cancel 以确定应用程序的退出代码。当使用红色 X 关闭表单时,这种情况就被打破了。我现在测试 DialogResult.OK 以指示成功退出。

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

5
投票

来自 MSDN:

此方法添加一个事件处理程序 Closed 的 mainForm 参数 事件。事件处理程序调用 ExitThread 来清理 申请。

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


3
投票

重载文档

public static void Run(
    ApplicationContext context );

有一个简洁的示例,采用不同的方法,也涉及两种形式。


2
投票

一个主要区别是 ShowDialog 通常是模式对话框。如果您想创建一个用户友好的工具集,您不会希望它由模式对话框组成。

此外,Application.Run() 接受的不仅仅是一个表单。它有一些过载。

至于你的申请,我认为这并不重要。 Application.Run 对我来说很有意义,因为它表示实际应用程序的开始。


2
投票

Application.Run()
用于启动应用程序,而
MainForm
是应用程序的一部分,
MainForm()).ShowDialog()
仅用于显示它。

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

Application.Run() 有不同的重载,其中之一是不带参数的。该方法无需初始表单即可启动应用程序。


2
投票

更具体的差异示例:

如果您的主窗体是 MDI 窗体,则单击关闭按钮(右上角的“x”或 Alt-F4)的行为会有所不同,具体取决于您用于显示窗体的方法。

使用

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

使用

mainForm.ShowDialog
,主窗体的关闭事件运行,子窗体的关闭事件不运行。


0
投票

从我的测试中我注意到,与 ShowDialog 相比,使用带有 DialogResult 的 Application.Run 按钮不会关闭表单(未点击 OnFormClosing),其中带有 DialogResult 的按钮点击 OnFormClosing 并关闭表单。

© www.soinside.com 2019 - 2024. All rights reserved.