创建窗体并在后台线程上使用 Form.ShowDialog

本文关键字:Form ShowDialog 线程 窗体 后台 创建 | 更新日期: 2023-09-27 18:36:18

Using Winforms,如果我在一个不是"主"UI 线程的线程上,我可以安全地

  1. 创建一个表单,
  2. 在该窗体上调用显示对话框

似乎我会遵守以下规则:必须在创建控件的线程上修改 Winforms 控件。

从我所做的一些阅读来看,ShowDialog 似乎会创建自己的消息泵,这样我就不必担心在已经具有消息泵的线程上创建表单。

问题的背景是我收到一个回调,我想在其中显示一些 Winforms UI,但我无法访问可用于调用主线程的任何其他 UI。

创建窗体并在后台线程上使用 Form.ShowDialog

这大致是正确的,尽管调用线程的 SetApartmentState() 方法将线程切换到 STA 非常重要。 对于许多 UI 操作(包括剪贴板、拖放和 shell 对话框)非常重要。 而且,当您在线程上创建的表单不在前台并隐藏在另一个窗口后面时,您通常会遇到一个糟糕的 Z 顺序问题。 或者有一个令人讨厌的习惯,即当用户不期望它并意外地抓住鼠标单击或击键时,实际上确实在前台移动。

这些都是很难解决的问题,它们确实会使您的应用程序变得脆弱。 没有充分的理由不调用引用,您也可以以某种方式将其传递给类。 如果真的有必要,你总是有Application.OpenForms[0]可以依靠。

是的,你可以这样做,但如果你想让对话框实际上像一个模态对话框(即,阻止父窗口,我假设你想要,因为你正在调用ShowDialog),那么准备好失望。

你在这里实际上想解决什么问题。 听起来你想要一个不阻塞的模式对话框,这有点奇怪。 如果您解释手头的问题,则可能存在您尚未考虑的解决方案。