WPF MVVM/Prism(6.2)/ Unity - PopupWindowAction在线程间流失

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并创建一个复合命令从模块提高它