【问题标题】:Graceful application shutdown using WPF PRISM 4使用 WPF PRISM 4 优雅地关闭应用程序
【发布时间】:2011-12-02 20:38:00
【问题描述】:

我正在寻找一种“最佳做法”(如果有最好的做法)来彻底关闭使用 MEF 和 PRISM4 的 WPF 应用程序。最终,我正在寻找某种“关闭服务”来管理从 Shell 到想要验证关闭应用程序是否可以的任何视图模型(或其他订阅者)的所有事件/命令。事件聚合器是最干净的方式吗?其他意见/选项?

理想情况下,我的 ToolbarRegion 中的 ToolbarView 上有一个按钮(我的 Shell 中的 2 个区域中的 1 个)。此按钮将调用我的 ToolbarViewModel 上的命令(引用我的 ToolbarControler 上的命令),这反过来会做两件事(我认为?)...首先,通知所有订阅者它的关闭时间并允许他们中的任何一个取消关闭并且...其次,如果没有取消,则以某种方式通知外壳程序关闭。我的应用程序的关闭模式设置为“ShutdownMode.OnMainWindowClose”,所以如果 Shell 关闭,我应该一切就绪。

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: wpf mef prism-4 eventaggregator


    【解决方案1】:

    我正在使用相同的东西开发一个大型应用程序:MEF 和 PrismV4

    我处理关机的方式有点不同:
    在 Shell 中,有一个“工具”区域,关闭事件在 Shell 中处理关闭事件。
    然后对于注入到另一个区域的所有东西,也就是一个tabcontrol,我将内容转换为IDisposable,并一个一个地关闭每个选项卡。 (其实它不是一个tabcontrol,它是一个avalondock组件,但其实是一回事)。
    当然,您必须在每个具有要处理的引用等的类上实现 IDisposable,但是如果不考虑该接口,很难想出一种“干净的关闭方式”,对吧? =)

    现在,关于 EventAggregator:你很可能会遇到麻烦,因为没有耦合:你可以通过它触发一个弱事件,但你不能等待对象完成它们的工作。
    然后,您无法制定取消关闭的机制。

    如果您希望您的各种视图能够取消关闭,我建议您创建一个包含单个方法的接口:

    public interface IShutdownAware
    {
       bool CanShutdown();
    }
    

    然后在调用 dispose 之前,调用 CanShutdown(); 如果它们都返回 true,则继续 disposing,否则,取消关闭过程。

    【讨论】:

    • 我喜欢这种方法,但我还有一个问题。您如何跟踪您的活动视图(或视图模型)?你迭代什么集合来调用“CanShutdown()”?您是否使用 IRegionManager 并查询活动视图?
    • 因为您会在 Shell 中执行此操作,所以您可以简单地查询您在 Shell 中拥有的各种布局元素的内容,然后对其进行迭代。使用 IRegionManager 也可能是可行的,尝试看看哪种方案最适合您的场景。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    相关资源
    最近更新 更多