gpt4 book ai didi

c# - WPF - 强制 ShowDialog 返回

转载 作者:太空狗 更新时间:2023-10-29 21:47:54 25 4
gpt4 key购买 nike

如何强制 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com