Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF MVVM/Prism(6.2)/Unity-PopupUpindowAction跨线程丢失所有者_Wpf_Mvvm_Unity Container_Prism_Prism 6 - Fatal编程技术网

WPF MVVM/Prism(6.2)/Unity-PopupUpindowAction跨线程丢失所有者

WPF MVVM/Prism(6.2)/Unity-PopupUpindowAction跨线程丢失所有者,wpf,mvvm,unity-container,prism,prism-6,Wpf,Mvvm,Unity Container,Prism,Prism 6,我已经在WPF/Prism中使用Unity和MVVM模式工作了将近一年。我已经非常成功地建立了一个shell、几个模块和许多很酷的东西,比如作用域管理器和shell托管的公共弹出窗口 今天我遇到了一件让我抓狂的事情:无法将Owner属性设置为已关闭的窗口。我需要定期检查程序集的更新,提示用户重新启动应用程序,然后在shell的ViewModel中处理。我用一个引导程序运行(),在引导程序中有一个杀死所有窗口的方法。动臂,窗口已关闭。 这个错误是有道理的(而且非常明显),但我似乎无法解决这个问题。

我已经在WPF/Prism中使用Unity和MVVM模式工作了将近一年。我已经非常成功地建立了一个shell、几个模块和许多很酷的东西,比如作用域管理器和shell托管的公共弹出窗口

今天我遇到了一件让我抓狂的事情:
无法将Owner属性设置为已关闭的窗口。
我需要定期检查程序集的更新,提示用户重新启动应用程序,然后在shell的ViewModel中处理。我用一个
引导程序运行()
,在
引导程序中有一个杀死所有窗口的方法。动臂,
窗口已关闭。

这个错误是有道理的(而且非常明显),但我似乎无法解决这个问题。在Prism 6.2
中,引入了以下内容(可能更多/更少):

if (AssociatedObject != null)
            wrapperWindow.Owner = Window.GetWindow(AssociatedObject);
根据堆栈跟踪,这就是导致它失败的原因,因为
PopupWindowAction
认为它是
Owner
是现在关闭的
窗口(尽管值得注意的是,这是新功能,未经测试<6.2)。我似乎找不到一种方法来重新实例化它,或者设置
所有者(或者类似的东西),或者甚至找不到应该在这里发生什么

我通过一个
InteractionRequestTrigger
启动这个
PopupWindowAction
,所有这些都只是打开一个自定义
UserControl
。此外,所有这些都发生在另一个线程上,因此我必须返回主
调度程序
,以查找我的作用域
交互服务
(它基本上触发
INotification
):


我的问题是:弹出窗口是否能找到它的父级,因为它已关闭,或者因为它现在位于单独的线程上?除此之外,这是一个合理的话题,还是有更好的解决方案来满足我的用户需求?

这肯定是因为所有者窗口已关闭,您是否说过dispatcher解决了跨线程问题

我不知道我是否完全明白,但是…
如果您卸载所有模块,但保持shell打开,我建议您在shellview中添加InteractionRequestTrigger,并创建一个复合命令从模块中引发它,这肯定是因为owner窗口已关闭,您是否说过dispatcher解决了跨线程问题

我不知道我是否完全明白,但是… 如果您卸载所有模块但保持shell打开,我建议您将InteractionRequestTrigger添加到shellview中,并创建一个复合命令从模块中引发它

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