1

大约一年来,我几乎一直在使用 Unity 和 MVVM 模式在 WPF/Prism 中工作。我在建立一个 shell、几个模块和许多很酷的东西方面取得了相当大的成功,比如作用域区域管理器和 shell 托管的常见弹出窗口。

我今天遇到了一件让我非常头疼的事情:Cannot set Owner property to a Window that has been closed. 我需要定期检查程序集的更新,提示用户重新启动应用程序,然后在 shell 的 ViewModel 中处理它。我正在使用bootstrapper.Run(), 和 inbootstrapper是一种杀死所有窗口的方法。繁荣,window that has been closed.

这个错误是有道理的(而且很明显),但我似乎无法解决这个问题。在Prism 6.2中,引入了这个(也许更多/更少):

if (AssociatedObject != null)
            wrapperWindow.Owner = Window.GetWindow(AssociatedObject);

根据堆栈跟踪,这就是导致它失败的原因,因为它PopupWindowAction认为它Owner是现在关闭Window的(尽管值得注意的是这是新功能并且没有经过测试 < 6.2)。我似乎无法找到一种方法来重新实例化它或(或类似SetOwner东西) - 甚至在这里应该发生什么。

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

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

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

4

1 回答 1

0

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

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

于 2017-10-12T08:14:13.273 回答