WPF MVVM/Prism(6.2)/Unity-PopupUpindowAction跨线程丢失所有者
我已经在WPF/Prism中使用Unity和MVVM模式工作了将近一年。我已经非常成功地建立了一个shell、几个模块和许多很酷的东西,比如作用域管理器和shell托管的公共弹出窗口 今天我遇到了一件让我抓狂的事情: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中处理。我用一个引导程序运行(),在引导程序中有一个杀死所有窗口的方法。动臂,窗口已关闭。 这个错误是有道理的(而且非常明显),但我似乎无法解决这个问题。
无法将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(...
//...