WPF MVVM/Prism(6.2)/ Unity - PopupWindowAction在线程间流失
我一直在使用Unity和MVVM模式几乎完全在WPF/Prism中工作了大约一年。我在建立一个shell,几个模块和很多很酷的东西(如作用域RegionManagers和shell托管的常见弹出窗口)方面取得了相当不错的成功。WPF MVVM/Prism(6.2)/ Unity - PopupWindowAction在线程间流失
我今天遇到了一些让我真的挠挠头脑的问题:Cannot set Owner property to a Window that has been closed.
我有一个要求,要定期检查程序集的更新,提示用户重新启动应用程序,然后在shell的ViewModel中处理它。我正在用bootstrapper.Run()
这样做,而在bootstrapper
是一个杀死所有窗口的方法。繁荣,window that has been closed.
错误是有道理的(而且很明显),但我似乎无法弥补的问题。在Prism 6.2
,这(也许更多/更少)介绍:
if (AssociatedObject != null)
wrapperWindow.Owner = Window.GetWindow(AssociatedObject);
根据堆栈跟踪,这是什么原因造成的失败,因为PopupWindowAction
认为它是Owner
是现已关闭Window
(尽管值得注意的是这是新功能,未经测试< 6.2)。我似乎无法找到一种方法来重新实例化它或Set
,Owner
(或沿着这些线) - 甚至应该发生在这里。
我通过InteractionRequestTrigger
解雇了PopupWindowAction
,所有这些只是打开了一个自定义UserControl
。此外,所有这一切都发生在另一个线程,所以我得去回主Dispatcher
找到我的作用域InteractionService
(这基本上是把一个点燃的INotification
):
Application.Current.Dispatcher.Invoke(() =>
{
var dialogResponse = InteractionService.ShowDialog(...
//...
我的问题是:不能弹出找到它的父母,因为它已关闭,或因为它现在在单独的线程上?除此之外,这是一个合理的事情要谈论还是有更好的解决方案,以我的用户的要求?
这是因为明确的所有者窗口关闭,有你说的调度解决跨线程问题。
我不知道如果我完全能够理解,但... 如果要卸载所有模块,但保持你的外壳打开,我建议你到InteractionRequestTrigger添加到您的shellview并创建一个复合命令从模块提高它