WPF MVVM / Prism(6.2)/ Unity - PopupWindowAction在线程中丢失所有者

时间:2017-09-01 20:34:32

标签: wpf mvvm unity-container prism prism-6

我使用Unity和MVVM模式几乎完全在WPF / Prism中工作了大约一年。我在建立一个shell,几个模块以及许多很酷的东西(如作用域的RegionManagers和shell托管的常用弹出窗口)方面取得了相当不错的成功。

今天我遇到了一些让我感到头疼的事: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(尽管它&# 39;值得注意的是,这是新功能,并未经过测试<6.2)。我似乎无法找到重新实例化的方法,或Set Owner(或类似的东西) - 甚至应该在这里发生的事情

我通过PopupWindowAction解雇此InteractionRequestTrigger,所有这些只会打开自定义UserControl。此外,所有这些都发生在另一个线程上,所以我必须回到主Dispatcher找到我的作用域InteractionService(它基本上会触发INotification):

Application.Current.Dispatcher.Invoke(() =>
{
    var dialogResponse = InteractionService.ShowDialog(...
//...

我的问题是:弹出窗口是否可以找不到它的父级,因为它已关闭,或者因为它现在位于一个单独的线程上?除此之外,这是一个合理的事情,或者是否有更好的解决方案给我的用户&#39;要求?

1 个答案:

答案 0 :(得分:0)

这是明确的,因为所有者窗口已关闭,您是否说过调度程序解决了交叉线程问题。

我不知道我是否完全得到它但是...... 如果你要卸载所有模块但保持shell打开,我建议你在你的shellview中添加一个InteractionRequestTrigger并创建一个复合命令来从你的模块中提取它