c# - WPF - 强制 ShowDialog 返回

标签 c# .net 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
}

当框架发送消息时(来自与 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/

相关文章:

c# - NuGet 依赖策略

C# 文件读/写文件共享似乎不起作用

.net - 在.NET项目中使用COM组件而不使用GAC

c# - 拖动 WPF Popup 控件

c# - WPF XAML 中的“无法创建”错误的实例

c# - 这可以解释为 C# 中的调用表达式吗?

c# - 如何对以下方法进行单元测试?

c# - 从 C++ 调用 C# 方法而不使用 COM

WPF 拖放不会触发 Command Binding.CanExecute

wpf - 按钮内容中的样式 DataTrigger Setter 无效