令人惊讶的是,通过将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?
答案 0 :(得分:4)
显示对话框不会阻止UI线程 - 否则您将无法与对话框进行交互。
它只是标志着一个未完成的模态对话框,它应该禁用所有其他非对话窗口的输入。
如果将ShowDialog调用调到调度程序中,调度程序将允许创建一个额外的对话框,因为当模态对话框未完成时你没有做一些禁止的事情 - 这是输入到其他非对话窗口
您的新对话框功能齐全,因为它是一个对话框,您不会尝试输入非对话框窗口。
切换应用程序应该将任何模态对话框放到前面,但由于你有多个模态对话框,系统会混淆哪一个应该是最顶层的。我建议您捕获激活事件,并手动将必要的对话框置于最顶端。