showdialog()的窗体点击message的按钮后,窗体也关闭了?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了showdialog()的窗体点击message的按钮后,窗体也关闭了?相关的知识,希望对你有一定的参考价值。
Form1.showdialog();的方式将Form1显示出来了,然后Form1里面的事件中有Messagebox.show();,弹出提示框之后,点击确定后,Form1窗体也没了,如何让Form1窗体不关闭。我有一个其他窗体,我对比了属性,事件等,都没问题,另一个窗体弹出Messagebox都不会关闭。蒙了。
在C#中窗口的显示有两种方式:模态显示(showdialog)和非模态显示(show)。二者最常见的区别是: 模态显示后, 弹出窗口阻止调用窗口的所有消息响应。只有在弹出窗口结束后调用窗口才能继续。 在模态窗口“关闭”后,可以读取模态窗口中信息,包括窗口的返回状态,窗口子控件的值。追问不好意思,这不是我想要的答案。
我现在遇到的难题在于,一个非模态窗口A弹出了一个模态窗口B,模态窗口B弹出了一个模态Messagebox,我关闭了Messagebox后,模态窗口B得到了Messagebox的DialogResult,跟着一块关闭了,我不想让他跟着关闭。
使用 form.ShowDialog() 时,主窗体中的线程不起作用
【中文标题】使用 form.ShowDialog() 时,主窗体中的线程不起作用【英文标题】:When using form.ShowDialog() a thread in mainform doesn't work 【发布时间】:2011-03-29 20:01:24 【问题描述】:我有一个使用 form.showDialog() 显示的表单,在主表单中我有一个线程每 x 秒发送一条消息。我注意到,当我在刚刚打开使用 ShowDialog 打开的新表单的窗口中时,线程没有运行。即使使用 ShowDialog,如何让它继续运行?
代码:
codeshowAllScriptsWindow window = new showAllScriptsWindow(this);
window.Show();
在主窗体中,我有一个线程不断发送消息,但由于此显示对话框而停止。请注意,当我使用 show() 时,它不会发生。
【问题讨论】:
你可以用一些代码来澄清一下。code
showAllScriptsWindow window = new showAllScriptsWindow(this); window.Show();code
\b 并且在主窗体中我有一个线程不断发送消息,但由于这个 showdialog 而被停止 - 不是当我使用 show() 时它不会发生。
【参考方案1】:
ShowDialog() 是一个阻塞调用。该线程实际运行,它正忙于为对话框抽出消息循环。这与程序主线程上发生的情况没有什么不同。
这样做是非常不明智的,对话框与应用程序中的其余窗口没有 Z 顺序关系。一个经典的事故是它可能会消失在另一个窗口后面,但用户没有找到找回它的好方法。改为使用 Control.BeginInvoke 在 UI 线程上创建对话框。这也确保您的线程保持“运行”。
【讨论】:
【参考方案2】:消息泵被您正在显示的模式对话框“窃取”。 你有两个选择:
-
不要使用模式对话框(使用 formShow())
使用新线程完成工作并将主线程用于 UI。
【讨论】:
【参考方案3】:虽然乍一看似乎无关,但你可以看看这个question。您遇到的问题是 form.showDialog() 调用创建了一个模式对话框,停止了该线程上的代码进程。如果您旋转另一个线程并在那里触发该调用,您的第一个线程将继续运行,如对话框显示。
【讨论】:
【参考方案4】:使用 System.Threading.Timer 而不是 System.Windows.Form.Timer。
【讨论】:
模态消息泵将使计时器的选择变得无关紧要。 通过 SWF Timer 使用消息泵。但是,使用 System.Threading Timer 不会使用泵,因此模型对话框不会阻止它引发事件。 很公平,吸取了教训。我已经习惯了所有计时器都基于 WM_TIMER 的世界。 我没有使用内置计时器,而是每隔 x 秒从服务器发送一条消息,客户端需要对其进行响应。以上是关于showdialog()的窗体点击message的按钮后,窗体也关闭了?的主要内容,如果未能解决你的问题,请参考以下文章
使用 form.ShowDialog() 时,主窗体中的线程不起作用
Application.Run()和Form.Show()以及Form.ShowDialog()
Windows 窗体:UI 线程使用 Show() 和 ShowDialog() 流动