C# Caliburn Micro中多窗口的正确引导方式?

C# Caliburn Micro中多窗口的正确引导方式?,c#,wpf,caliburn.micro,C#,Wpf,Caliburn.micro,我正在使用Caliburn.Micro开发一个应用程序。我需要在多个显示器上同时打开一组相同的窗口,但我不知道如何干净地执行此操作 我的想法是: ChildView模型/ChildView包含我需要在多个屏幕上显示的内容 ParentViewModel继承自ConductorBase 当创建ParentViewModel时,它会创建所需数量的ChildViewModel,并使用WindowManager.ShowWindow来显示它们中的每一个 我的WindowManager实现负责将这些视图

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

我的想法是:

  • 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
在最近的一段时间里,我们遇到并解决了WPF应用程序开始不可见的问题,只能在系统托盘中找到,并且从那里可以显示/隐藏实际的主应用程序窗口。
在该场景中,我们将隐藏/显示主应用程序窗口的任务卸载给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