Hyp*_*ion 6 .net c# wpf modal-dialog showdialog
我如何强制ShowDialog从后台线程返回?
我有一个构建在C++/CLR框架之上的WPF应用程序,它正在监听框架发送的消息.一个特定的消息非常重要,我需要关闭所有当前窗口.但是,如果模态Dialog(由ShowDialog我的主窗口创建)处于活动状态并等待用户输入,则窗口将不会关闭,因为它正在等待ShowDialog返回.如何强制模态Dialog关闭和解除代码执行?
我尝试设置DialogResult或调用Close,但似乎不起作用.
编辑:Dialog由我的主窗口创建,它需要一个返回值,如下所示:(在单击事件处理程序中MainWindow):
Window modalDialog = new Window();
bool ret = (bool)modalDialog.ShowDialog();
if (ret == true)
{
// do stuff
}
else
{
// do some other stuff
}
Run Code Online (Sandbox Code Playgroud)
当框架发送消息(进入与UI线程不同的线程)时,我打电话MainWindow.Close().此时模态对话框将关闭,但检查Dialog(after ShowDialog)返回值的代码仍在堆栈中.不知怎的,这迫使主窗口不会消失.
当对话框收到 WM_CLOSE 消息时,它会设置一个标志,使 ShowDialog 在 WM_CLOSE 和任何包含的消息被完全处理后返回。Dispatcher.Invoke()因此,如果您在线程上执行 a来调用MainWindow.Close(),则只有在完成ShowDialog()后才会返回。Dispatcher.Invoke()
所以简单的解决办法就是从 the 返回,Dispatcher.Invoke()让 theShowDialog()返回。如果需要更多处理,请Dispatcher.Invoke()立即再进行一次。
如果您以其他方式进行线程转换Dispatcher.Invoke(),或者ShowDialog()在 Dispatcher.Invoke() 调用返回后没有返回,您可能需要发布一些围绕您的Window.Close()调用的代码,以便我们可以看到您实际在做什么。
| 归档时间: |
|
| 查看次数: |
4188 次 |
| 最近记录: |