如何强制 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
}
当框架发送消息时(来自与 UI 线程不同的线程),我调用 MainWindow.Close()
。此时模态对话框关闭,但是检查 Dialog
返回值的代码(在 ShowDialog
之后)仍在堆栈中。这会以某种方式强制主窗口不消失。
最佳答案
当对话框收到 WM_CLOSE 消息时,它会设置一个标志,使 ShowDialog 在 WM_CLOSE 和任何包含的消息已被完全处理后返回。因此,如果您在线程上执行 Dispatcher.Invoke()
以调用 MainWindow.Close()
,则 ShowDialog()
不会返回直到 Dispatcher.Invoke()
完成。
所以简单的解决方案是从 Dispatcher.Invoke()
返回,让 ShowDialog()
返回。如果需要更多处理,请立即执行另一个 Dispatcher.Invoke()
。
如果您使用 Dispatcher.Invoke()
以外的方式进行线程转换,或者如果 ShowDialog()
在 Dispatcher.Invoke( ) 调用返回,您可能需要发布一些围绕您的 Window.Close()
调用的代码,以便我们可以看到您实际在做什么。
关于c# - WPF - 强制 ShowDialog 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2031789/