mar*_*mnl 3 wpf multithreading showdialog
令人惊讶的是,通过在调度程序上调用 ShowDialog() 可以一次显示多个对话框:
uiDispatcher.BeginInvoke(new Func<bool?>(myWindow.ShowDialog));
Run Code Online (Sandbox Code Playgroud)
这是怎么回事,一旦显示对话框,UI 仍然运行以响应用户交互(我本以为不会,因为 ShowDialog() 会阻塞它所在的线程,而该线程必须是 UI 线程),甚至可以继续显示新对话框:
Window myWindow;
for(int i = 0; i < 5; i ++)
{
myWindow = new Window();
uiDispatcher.BeginInvoke(new Func<bool?>(myWindow.ShowDialog));
}
Run Code Online (Sandbox Code Playgroud)
而且用户界面仍然具有响应能力。
我应该注意这种行为吗?(当某些后台线程想要时,我想在另一个对话框之上显示一个对话框 - 这是可行的 - 唯一不需要的行为似乎是切换应用程序时,有时 WPF 不知道哪个对话框应该在顶部 - 但仍然允许你带一个对话框通过单击将对话框移到前面,这对于对话框来说是不常见的,因为通常不允许在对话框外部单击)。
更新:我遇到的一个问题是,如果您隐藏其中一个对话框,用户可以再次与所有其他 Windows 进行交互!(不仅仅是其他对话框)。请参阅:WPF 对话框不是模态的?
显示对话框不会阻塞 UI 线程——否则您将无法与对话框交互。
它仅仅标志着存在一个未完成的模式对话框,并且它应该禁用对所有其他非对话框窗口的输入。
如果您将 ShowDialog 调用混入调度程序,则调度程序将允许创建一个附加对话框,因为您没有执行模式对话框未完成时禁止的操作(即输入到其他非对话框窗口)。
您的新对话框功能齐全,因为它是一个对话框,并且您没有尝试在非对话框窗口中输入内容。
切换应用程序应该将任何模式对话框置于最前面,但由于您有多个模式对话框,系统会困惑于哪一个应该位于最顶层。我建议您捕获激活事件并手动将必要的对话框置于最顶层。
| 归档时间: |
|
| 查看次数: |
3168 次 |
| 最近记录: |