我使用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;要求?
答案 0 :(得分:0)
这是明确的,因为所有者窗口已关闭,您是否说过调度程序解决了交叉线程问题。
我不知道我是否完全得到它但是...... 如果你要卸载所有模块但保持shell打开,我建议你在你的shellview中添加一个InteractionRequestTrigger并创建一个复合命令来从你的模块中提取它