gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:43:01 25 4
gpt4 key购买 nike

大约一年来,我几乎一直在使用 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 (尽管值得注意的是这是新功能,并且未经过测试 < 6.2)。我似乎找不到重新实例化它的方法或 Set Owner (或类似的东西)——甚至是这里应该发生的事情。

我要开这个 PopupWindowAction通过 InteractionRequestTrigger ,所有这些都只是打开了一个自定义 UserControl .此外,所有这些都发生在另一个线程上,所以我必须回到主要的 Dispatcher找到我的范围 InteractionService (基本上会触发 INotification ):
Application.Current.Dispatcher.Invoke(() =>
{
var dialogResponse = InteractionService.ShowDialog(...
//...

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

最佳答案

这绝对是因为所有者窗口已关闭,您是否说过调度程序解决了跨线程问题。

我不知道我是否完全明白,但是……
如果您要卸载所有模块但保持外壳打开,我建议您将 InteractionRequestTrigger 添加到您的外壳 View 并创建一个复合命令以从您的模块中提升它

关于WPF MVVM/Prism (6.2)/Unity - PopupWindowAction 跨线程失去所有者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46007659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com