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


72

在我的应用程序中,如果登录成功,我想先显示一个登录表单,然后显示主表单。目前,我正在执行以下操作:

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

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

Answers:


67

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());
}

另一种方法是自己做管道MainFormLoginForm如果登录成功,则在关闭事件中打开一个实例。


那么,这意味着您可以在与两种形式相同的线程上有一个消息循环,同时能够分别处理三种形式?
SomeNickName

5

从MSDN:

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

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


7
这是唯一值得注意的区别吗?我检查了Reflector,看来幕后还有很多事情要发生,这取决于调用哪个。肯定还有一些细微的差异,尽管我不能说什么-反射的代码是非常神秘的。
Vilx-

1
我刚刚发现一个疯狂的人,然后我在谷歌搜索时来到这里,看看是否有人可以解释为什么:今天我花了大约一个小时的时间试图弄清楚为什么在我的表单上this.Hide()和this.Visible = false ,两者实际上都是关闭表单而不是隐藏表单。我完全感到困惑。显然存在一些差异-完全可复制!-在哪里form.ShowDialog()可以做到这一点,但是Application.Run()可以完成预期的工作。这是怎么回事?(我想这个主意是因为它是模态的,如果没有显示,就假定您要关闭它。)
neminem

5

通过测试,我注意到了以下主要区别:

使用Application.Run时,窗体的“关闭”按钮(红色X)将返回DialogResult.None;否则,将返回DialogResult.None。但是,使用ShowDialog时,“关闭”按钮将产生DialogResult.Cancel。

这对你有关系吗?在我的代码中,我正在测试DialogResult.Cancel,以确定我的应用程序的退出代码。当红色X用于关闭表格时,这种情况被破坏了。我现在测试DialogResult.OK以指示成功退出。

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

1
这是因为Application.Run使用Form.Show()
Soroush Falahati

2

一个主要的区别是ShowDialog通常是模式对话框。如果要创建用户友好的工具集,则不希望它包含模式对话框。

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

至于您的申请,我认为这没什么大不了的。Application.Run对我来说很有意义,因为它表示您实际的Application的开始。


因为这是我的主要形式,所以它是否是模式对话框并不重要,不是吗?
Vilx-


2

有关差异的更简短的示例:

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

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

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


1

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

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

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


1
那么,对于我应该选择哪一个,这意味着什么呢?到目前为止,在我看来,两种方法都可以正常工作。但是必须有一些细微的差别,对吗?
Vilx-

0

从我的测试中,我注意到将DialogResult与Application.Run按钮一起使用不会关闭窗体(未单击OnFormClosing),而与DialogResult的按钮单击OnFormClosing并关闭窗体的ShowDialog相比,ShowDialog却没有。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.