C# Caliburn Micro中多窗口的正确引导方式?
我正在使用Caliburn.Micro开发一个应用程序。我需要在多个显示器上同时打开一组相同的窗口,但我不知道如何干净地执行此操作 我的想法是:C# Caliburn Micro中多窗口的正确引导方式?,c#,wpf,caliburn.micro,C#,Wpf,Caliburn.micro,我正在使用Caliburn.Micro开发一个应用程序。我需要在多个显示器上同时打开一组相同的窗口,但我不知道如何干净地执行此操作 我的想法是: ChildView模型/ChildView包含我需要在多个屏幕上显示的内容 ParentViewModel继承自ConductorBase 当创建ParentViewModel时,它会创建所需数量的ChildViewModel,并使用WindowManager.ShowWindow来显示它们中的每一个 我的WindowManager实现负责将这些视图
/ChildView模型
包含我需要在多个屏幕上显示的内容ChildView
继承自ParentViewModel
ConductorBase
- 当创建
时,它会创建所需数量的ParentViewModel
,并使用ChildViewModel
来显示它们中的每一个WindowManager.ShowWindow
- 我的
实现负责将这些视图放置在它们应该位于的位置WindowManager
ParentView
显示在自己的窗口中。我怎样才能避免这种情况发生?做我想做的事情的标准方式是什么
我想做的是从一个导体引导多个窗口,导体本身不显示窗口。也许我又错过了什么,但根据您提供的信息,您可以执行以下操作 第一步
- 转到处理菜单单击的类(VM)
- 添加一个私有值
,该值将执行与您的ParentConductor
相同的操作(保留对每个子项的引用,如果一个子项已关闭,则关闭所有子项)ParentViewModel
- 修改MenuclickClickCommand,以便每次单击该命令时都能在发生事件后
- 输入您的
ParentConductor
- 创建您孩子的并将ref添加到您的
ParentConductor
- 使用Caliburn为每个子级创建windows
父视图
,因为您的导体将和您的类(VM)一样长寿
您还可以添加一个方法,以便指挥可以在关闭其孩子的后将他自己从类中删除。该模式如何
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。其职责是在需要时打开/关闭所有单桌面父窗口。由于是完全分开的窗户,因此不需要一根完全通电的导线。根据我的经验,为它提供iWindows管理器就足够了,这样它就可以实际显示/关闭单个桌面父窗口。也许它也可以激活/停用它们,但不需要跟踪当前活动的项目或类似的事情
- SingleDesktopVM负责内部显示的所有子视图/VM。如果需要的话,这可能是一个导体。。。这实际上取决于父视图中那些子视图的生命周期。例如,如果有一个命令栏和一个主内容,并且它们总是在那里,那么可能您可以使用包含其他VM的更简单的父VM
在该场景中,我们将隐藏/显示主应用程序窗口的任务卸载给SystemTrayVM调用的助手类(而不是VM)。这相当于此模式中的MultipleDesktopManager 对于仅从系统托盘开始的WPF应用程序,我们将展示如何通过Autofac将控制与Caliburn.Micro ViewModel first方法和DI完全集成
编辑:基本原理是CM提供的现成导体实现似乎更适合容纳其他子窗口的窗口。如果支架本身不可见,那么这些导体实现可能不是完美的选择。正如你在评论中所说,这就像需要一个指挥而不是一个屏幕。关于“准导体”有一点很有趣。最后,MultipleDesktopManager的思想基本上是一个简单的导体,它管理许多窗口,不实现IConductor接口,但仍然使用WindowManager来正确处理SingleDeskTopVM的生命周期。如何打开此窗口?单击按钮,启动应用程序?单击通知区域上下文菜单中的菜单项。这不应该是相关的。单击此按钮时,您正在发出命令,对吗?所以你可以用这个命令“打开”这个窗口。我不知道Caliburn是怎么做到这一点的,但是这个命令就是我尝试打开窗户的位置。如果你阅读了这个问题,你会发现问题在于它要求父视图同时可见。我已经看过了,但可能没有抓住要点。为什么需要ParentViewModel/ParentView?它做什么?你的答案一般列出了你要做什么来显示一组窗口。这里的问题是如何按照Caliburn.Micro的惯例正确执行。代码是必需的。@VegardLarsen您为什么使用
ConductorBase
而不是Conductor
?没有。只是方便而已。我的实现不一定正确,例如,我认为我真正需要的是一个不实现IScreen的独立导体。谢谢。我已经看过你在Github上的工作,并使用了其中的一些。你的描述基本上正是我想要的。我现在运行得很好,只有一个例外。每当我关闭从托盘打开的第一个窗口时,整个应用程序都会退出。在引导程序中,我使用NotificationIcon
f