2

令人惊讶的是,通过在 Dispatcher 上调用 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 对话框不是模态的?

4

1 回答 1

4

显示对话框不会阻塞 UI 线程——否则您将无法与对话框交互。

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

如果您将 ShowDialog 调用混入调度程序,则调度程序将允许创建一个附加对话框,因为您没有执行模式对话框未完成时禁止的操作——即输入到其他非对话框窗口。

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

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

于 2011-03-11T06:48:31.150 回答