我正在使用 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/