显示模态对话框(messageBox)会冻结应用程序中的其他窗口

3
我有一个应用程序,它展示了多个不同的顶层窗口,这些窗口都在同一个消息循环线程中托管。这是为了让用户打开相同数据的不同视图。(在 MS Outlook 中,您可以右键单击其他文件夹并选择“在新窗口中打开”来获得类似的行为)。
我遇到的问题是,当其中一个窗口打开模态对话框或消息框时,它会冻结父窗口的所有兄弟姐妹窗口。
当我打开模态对话框时,我希望它只针对父/所有者窗口进行模态,并且不影响应用程序中其他顶级窗口。有没有合理的方法来做到这一点?我已经考虑过:
- 用非模态对话框替换模态对话框,并在其打开时禁用父窗口 - 在应用程序中为每个窗口创建不同的线程
有什么建议吗?

2
据我所知,这个问题目前没有好的解决方案。如果有的话,我很乐意听取建议。 - SLaks
我认为你最好选择“用非模式对话框替换模式对话框,在打开它们时禁用父窗口”,然后禁用ParentForm。接着,订阅所有的表单到一个事件,如果表单关闭就检查是否还有其他打开的表单(可能是某种计数器?),如果没有,则重新启用主表单。 - TBohnen.jnr
这里有很多关于此话题的讨论:http://stackoverflow.com/questions/3494539/what-thread-handles-modal-dialog-windows-in-net - ralf.w.
1个回答

4

“Modal”是什么意思?你需要将其变成非模态,使用表单并使用其Show()方法进行显示。要禁用UI的某些部分,请将控件或表单的Enabled属性设置为false。使用表单的FormClosed事件将其设置回true。请注意,这通常不会改善可用性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接