令人惊讶的是,通过将Dispatchcher上的ShowDialog()调用,一次可以显示多个对话框:
uiDispatcher.BeginInvoke(new Func<bool?>(myWindow.ShowDialog));
如何运行,并且一旦显示对话框,UI仍会继续响应用户交互(我不认为这是因为ShowDialog()阻塞了它所在的线程,而该线程必须是UI线程),甚至可以继续显示新对话框:
Window myWindow;
for(int i = 0; i < 5; i ++)
{
myWindow = new Window();
uiDispatcher.BeginInvoke(new Func<bool?>(myWindow.ShowDialog));
}
UI仍然响应。
我应该谨防这种行为吗? (我想在某些后台线程想要时将一个对话框显示在另一个对话框的上方-这可行-唯一不想要的行为似乎是在切换应用程序时,有时WPF不知道哪个对话框应该位于顶部-但仍然允许您携带通过单击它来选择最前面的一个对话框,这对对话框是不常见的,因为通常不允许在对话框外单击。
更新:我遇到的一个问题是,如果您隐藏了一个对话框,则用户可以再次与所有其他Windows进行交互! (而不仅仅是其他对话框)。另请:WPF Dialog not modal?
最佳答案
显示对话框不会阻止UI线程-否则您将无法与对话框进行交互。
它仅表示以下事实:存在未完成的模态对话框,并且应禁用对所有其他非对话窗口的输入。
如果将ShowDialog调用拖到调度程序中,则调度程序将允许创建其他对话框,因为您没有执行模态对话框突出时禁止执行的操作,即将其输入到其他非对话框窗口中。
您的新对话框具有完整的功能,因为它是一个对话框,并且您不尝试输入非对话窗口。
切换应用程序应该将任何模式对话框都放在最前面,但是由于您有多个模式对话框,因此系统会感到困惑,即哪个对话框应该位于最顶层。我建议您捕获激活事件,然后手动将必要的对话框置于最顶部。
关于wpf - 在WPF中显示多个对话框是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5269809/