WPF - 强制的ShowDialog返回
-
19-09-2019 - |
题
我怎么能强迫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
后)的返回值仍然是在栈上。不知何故这迫使主窗口不会消失。
解决方案
当对话框接收它设置导致的ShowDialog返回后WM_CLOSE和任何含消息已经被完全处理的标志WM_CLOSE消息。所以,如果你正在做一个Dispatcher.Invoke()
到你的线程调用MainWindow.Close()
,该ShowDialog()
不会返回,直到Dispatcher.Invoke()
完成后。
所以,简单的解决方案是从Dispatcher.Invoke()
返回得到ShowDialog()
返回。如果需要更多的处理,做另一个Dispatcher.Invoke()
随即。
如果你正在做的线程过渡比Dispatcher.Invoke()
一些其他的方式,或者如果ShowDialog()
不会在Dispatcher.Invoke()调用返回后返回,你可能要发布一些代码周围您Window.Close()
调用,这样我们就可以看到你实际上在做什么。
其他提示
您不能强迫的ShowDialog返回,但你可以把窗户听取你的框架中发送的事件,可以告诉它关闭。另外,在以下的研究进展事件的例子有完成时,“完成”标志关闭窗口。
SomeGenerator IG = Manager.SomeGenerator();
SomeWindow PP = new SomeWindow();
IG.ProgressEvent += PP.ProgressEvent;
IG.ExecuteAsync();
PP.ShowDialog();
我现在意识到,我不能强迫的ShowDialog返回并继续执行每当我想它。该请求的事件处理程序,我从框架需要接收出去上下文所以调用栈可以退绕和模态对话框可以处理关闭消息。
我结束了设置一个布尔标志,请求模态关闭,然后从我的框架事件处理程序返回。只有在这一点上会ShowDialog的回报,我可以检查我设置标志,并继续请求的操作。