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();