c# - 在 Caliburn Micro 中进行多个窗口的正确方法?

标签 c# wpf caliburn.micro

我正在使用 Caliburn.Micro 开发应用程序。我需要同时在多台显示器上打开一组相同的窗口,但我不知道如何干净利落地执行此操作。

我的想法是这样的:

  • ChildViewModel/ChildView包含我需要在多个屏幕上显示的内容。
  • ParentViewModel继承自 ConductorBase<ChildViewModel> .
  • 何时ParentViewModel已创建,它会创建所需数量的 ChildViewModel并使用 WindowManager.ShowWindow展示他们每个人。
  • 我的 WindowManager实现负责将这些 View 放置在它们应该放置的位置。

以上所有作品,只有一个异常(exception):ParentView显示在它自己的窗口中。我怎样才能避免这种情况发生?做我想做的事情的规范方式是什么?

我想做的是从单个导体引导多个窗口,而导体本身不显示窗口。

最佳答案

这个模式怎么样?

                          SystemTrayVM
      (VM for your notification area, its View is the sys tray icon)
                                |
                                |
                      MultipleDesktopManager
      (not a VM, not a ConductorBase, no View, not visible)
                                |
            .-------------------|------------------.
            |                   |                  |
            |                   |                  |
    SingleDesktopVM      SingleDesktopVM     SingleDesktopVM
(its View holds child views. If necessary, it can be a ConductorBase)
                                |
                  .-------------|------------.------ - - - .
                  |             |            |
                  |             |            |
         SideBarChildVM    MainChildVM   FooterChildVM
  • SystemTrayVM 负责通过通知区域提供的所有交互(右键单击菜单操作等)。它实际上不会打开/关闭用户可见的窗口,而是将这些命令转发给 MultipleDesktopManager

  • MultipleDesktopManager 不可见且不是 VM。它的责任是例如在需要时打开/关闭所有单个桌面父窗口。作为完全独立的窗口,应该不需要完全熔断的导体。根据我的经验,为它提供一个 IWindowManager 就足够了,这样它就可以实际显示/关闭单个桌面父窗口。也许它也可以激活/停用它们,但不需要跟踪当前事件项目或类似的东西。

  • SingleDesktopVM 负责其内部显示的所有 subview /VM。因此,如果需要,这可能是一个指挥......它实际上取决于父 View 中那些 subview 的生命周期。例如。如果有一个命令栏和一个主要内容并且它们始终存在,那么您可能可以使用包含其他 VM 的更简单的父 VM。

最近我们遇到并解决了 WPF 应用程序开始时不可见的问题,只能在系统托盘中找到,并且能够显示/隐藏实际主应用程序窗口。< br/> 在那种情况下,我们将隐藏/显示主应用程序窗口的任务卸载到由 SystemTrayVM 调用的辅助类(而不是 VM)。这相当于此架构中的 MultipleDesktopManager

关于仅从系统托盘启动的 WPF 应用程序,我们整理了一个 PoC on GitHub这显示了如何完全集成 this WPF NotifyIcon通过 Autofac 使用 Caliburn.Micro ViewModel 优先方法和 DI 进行控制。

编辑:基本原理是 CM 提供的现成的 Conductor 实现似乎更适合窗口持有其他子窗口。如果持有人本身不可见,那么这些导体实现可能不是完美的选择。正如您在评论中所说,这就像需要一个导体而不是也是一个屏幕。 CM composition doc page 上有一点很有趣关于“准导体”。最后,MultipleDesktopManager 的想法基本上是一个管理多个窗口的简单导体,没有实现 IConductor 接口(interface)但仍然使用 WindowManager以便正确处理 SingleDesktopVMs 生命周期。

关于c# - 在 Caliburn Micro 中进行多个窗口的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31849562/

相关文章:

c# - WPF - 为什么 ValidationRule 不是 DependencyObject?

c# - 选择 WPF 随机画笔颜色

c# - 在用户控件中公开控件的 itemsource 属性

c# - 当有 "this"参数时AssertWasCalled

c# - 显示启动画面导致 InvalidOperationException

c# - 在 DataGrid 中绑定(bind)自定义 header 控件

c# - 如何模拟ServiceBusClient

c# - 如何以更好的方式分配 DBNull?

c# - 如何允许访问某些 Controller 而不访问 ASP.NET MVC 4 中的其他 Controller

c# - 绑定(bind) IsEnabled 不起作用