C# WPF-强制ShowDialog返回

C# WPF-强制ShowDialog返回,c#,.net,wpf,modal-dialog,showdialog,C#,.net,Wpf,Modal Dialog,Showdialog,如何强制ShowDialog从后台线程返回 我有一个WPF应用程序构建在一个C++/CLR框架之上,该框架正在侦听该框架发送的消息。有一条消息非常重要,我需要关闭所有当前窗口。但是,如果模式对话框(由我的主窗口中的ShowDialog创建)处于活动状态并等待用户输入,则窗口将不会关闭,因为它正在等待ShowDialog返回。如何强制模式对话框关闭和释放代码执行 我尝试设置对话框result或调用Close,但似乎不起作用 编辑:对话框由我的主窗口创建,它需要返回值,如下所示: (在main窗口中

如何强制
ShowDialog
从后台线程返回

我有一个WPF应用程序构建在一个C++/CLR框架之上,该框架正在侦听该框架发送的消息。有一条消息非常重要,我需要关闭所有当前窗口。但是,如果模式
对话框
(由我的主窗口中的
ShowDialog
创建)处于活动状态并等待用户输入,则窗口将不会关闭,因为它正在等待
ShowDialog
返回。如何强制模式
对话框
关闭和释放代码执行

我尝试设置
对话框result
或调用
Close
,但似乎不起作用

编辑:
对话框
由我的主窗口创建,它需要返回值,如下所示: (在
main窗口中的单击事件处理程序中
):


当框架发送消息时(来自与UI线程不同的线程),我调用
MainWindow.Close()
。此时模式对话框关闭,但是检查
对话框
(在
ShowDialog
之后)返回值的代码仍在堆栈上。不知何故,这会强制主窗口不消失。

您不能强制ShowDialog返回,但您可以让窗口侦听框架发送的事件,该事件可以告诉它关闭。在下面的示例中,进度事件有一个“完成”标志,完成后关闭窗口

SomeGenerator IG = Manager.SomeGenerator();
SomeWindow PP = new SomeWindow();
IG.ProgressEvent += PP.ProgressEvent;
IG.ExecuteAsync();            
PP.ShowDialog();

当对话框收到WM_CLOSE消息时,它会设置一个标志,使ShowDialog在WM_CLOSE和任何包含消息的消息被完全处理后返回。因此,如果在线程上执行
Dispatcher.Invoke()
,以调用
main window.Close()
,则在
Dispatcher.Invoke()
完成之前,
ShowDialog()
不会返回

因此,简单的解决方案是从
Dispatcher.Invoke()。如果需要更多处理,请立即执行另一个
Dispatcher.Invoke()


如果执行线程转换的方式不是
Dispatcher.Invoke()
,或者如果在Dispatcher.Invoke()调用返回后
ShowDialog()
没有返回,则可能必须发布
窗口.Close()周围的一些代码
调用,这样我们就可以看到您实际在做什么。

我现在意识到,我无法强制ShowDialog在需要时返回并继续执行。我从框架收到的请求的事件处理程序需要脱离上下文,这样调用堆栈就可以展开,模态对话框就可以处理关闭消息


最后,我设置了一个布尔标志,请求关闭modals,然后从框架事件处理程序返回。只有在这一点上,ShowDialog才会返回,我可以检查我设置的标志并继续执行请求的操作。

我编辑了我的原始问题,以表明ShowDialog将返回一个值,并且父窗口应该对该值进行一些处理……听起来我的答案是正确的,并帮助您解决了问题你的问题。如果您同意,您应该为未来的访客标记为“正确”。
SomeGenerator IG = Manager.SomeGenerator();
SomeWindow PP = new SomeWindow();
IG.ProgressEvent += PP.ProgressEvent;
IG.ExecuteAsync();            
PP.ShowDialog();