在WPF中显示多个对话框是否安全?

时间:2011-03-11 06:42:19

标签: wpf multithreading showdialog

令人惊讶的是,通过将ShowDialog()调用放在Dispatcher上,可以一次显示多个对话框:

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不知道哪个对话框应该在顶部 - 但仍然允许您通过单击它将其中一个对话框带到前面,这对于对话框来说是不常见的,因为通常不允许在对话框外单击。 / p>

更新:我遇到的一个问题是,如果您隐藏了一个对话框,用户可以再次与所有其他Windows进行交互! (不只是其他对话框)。请参阅:WPF Dialog not modal?

1 个答案:

答案 0 :(得分:4)

显示对话框不会阻止UI线程 - 否则您将无法与对话框进行交互。

它只是标志着一个未完成的模态对话框,它应该禁用所有其他非对话窗口的输入。

如果将ShowDialog调用调到调度程序中,调度程序将允许创建一个额外的对话框,因为当模态对话框未完成时你没有做一些禁止的事情 - 这是输入到其他非对话窗口

您的新对话框功能齐全,因为它是一个对话框,您不会尝试输入非对话框窗口。

切换应用程序应该将任何模态对话框放到前面,但由于你有多个模态对话框,系统会混淆哪一个应该是最顶层的。我建议您捕获激活事件,并手动将必要的对话框置于最顶端。