首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Application.Run()和Form.ShowDialog()有什么区别?

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

Stack Overflow用户
提问于 2010-02-23 05:52:22
回答 8查看 61.9K关注 0票数 74

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

代码语言:javascript
运行
复制
var A = new LoginForm();
if ( A.ShowDialog() == DialogResult.OK )
    Application.Run(new MainForm());

但是后来我开始想-- Application.Run()的意义是什么?为什么不干脆也用(new MainForm()).ShowDialog()呢?有什么关系呢?什么才是实现我想要的东西的正确方法?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-02-23 07:47:33

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

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

启动WinForms应用程序的推荐方式是使用Application.Run,但我怀疑这更像是一种惯例,而不是规则。使用Application.Run的最大原因是您想要打开多个非模式表单。您可以使用以下命令执行此操作:

代码语言:javascript
运行
复制
new Form().Show();
new Form().Show();
Application.Run();

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

至于您的问题,如果登录成功,如何显示登录表单和主表单,我认为您所拥有的已经很好了:

代码语言:javascript
运行
复制
if (new LoginForm().ShowDialog() == DialogResult.OK)
{
    Application.Run(new MainForm());
}

另一种方法是自己进行检测,如果登录成功,则在LoginForm的关闭事件中打开MainForm实例。

票数 70
EN

Stack Overflow用户

发布于 2010-02-23 06:00:31

来自MSDN:

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

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

票数 5
EN

Stack Overflow用户

发布于 2011-09-16 02:54:00

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

当使用Application.Run时,窗体的Close按钮(红色X)返回DialogResult.None;但是,当使用ShowDialog时,Close按钮生成DialogResult.Cancel。

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

代码语言:javascript
运行
复制
        return myForm.DialogResult == DialogResult.OK ? 0 : 1;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2314514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档