【发布时间】:2017-06-20 14:55:15
【问题描述】:
正如标题所说,我运行 form.ShowDialog(parentForm),其中 parentForm 是有效的 IWin32Window 继承表单,打开的窗口阻止访问父表单(如预期的那样),但 也是 阻止访问我的主窗体。
我能看到的唯一原因是主窗体和父窗体与显示的对话框位于同一线程上。有没有可能发生这种情况的原因?而且,如果问题是由共享线程引起的,有没有办法在不打开单独线程的对话框的情况下解决它?
【问题讨论】:
-
主窗体和父窗体有什么关系?他们之间是否存在现有的所有者/拥有或父/子关系?如果有,是什么?
-
这就是模式对话框在 Windows 中的工作方式(所有者与被阻止的内容无关)。在同一线程上显示为非模式或在单独的线程上显示为模式(只是不确定在后一种情况下是否可以使用来自另一个线程的所有者)。
-
你很容易让自己陷入很多的麻烦。如果你不喜欢 ShowDialog() 的作用,那么就不要使用它,而是使用 Show() 并使用 FormClosing 事件来知道窗口即将消失。但请务必了解 为什么 ShowDialog 存在以及它避免了哪些可能的错误。重入错误与线程错误一样令人讨厌。 Read this.
-
@Ivan 谢谢,我认为你是对的。我的方法可能是在当前线程上显示一个非模态表单。