我正在使用 Prism 和 Unity 进行 WPF 试点项目,我的应用程序有 3 个模块。
模块 A 有 2 个视图,模块 B 有 1 个视图,模块 C 有 1 个视图(本质上是一个主菜单),我有我的 shell。该外壳有 3 个区域,ribbonRegion、leftRegion、rightRegion。
现在模块 C 的视图被加载到 shell leftRegion 中,它可以选择运行其他模块。当您选择一个任务时(这是目前唯一的选项)模块 A 视图 1 也在左侧区域中导航(替换主菜单视图),模块 B 视图 1 也在右侧区域中导航。
Module A view1 也有一个导航按钮,Module A view2 在 leftRegion 中,可以返回。
当我不了解 LifetimeManagers 时,这一切都很好,我可以在 A 的 view1 和 view2 之间来回切换,同时始终显示 B 的 view1,并且我的菜单有效。然而,我后来意识到,每次我导航到一个视图时,都会解析 A 的 view1 和 view2 的一个新实例。这是有问题的,因为在解析每个新视图时都会创建一个新的 ViewModel,但后来我开始了解 LifetimeManagers,所以我从瞬态变为受控。但后来我的导航坏了。
ModuleA 定义:(B 和 C 的方法相同)
container.RegisterType<Object, View1>(ViewNames.View1, new ContainerControlledLifetimeManager());
container.RegisterType<Object, View2>(ViewNames.View2, new ContainerControlledLifetimeManager());
从主菜单导航:
regionManager.RequestNavigate(RegionNames.RightRegion, ViewNames.TifView);
regionManager.RequestNavigate(RegionNames.LeftRegion, ViewNames.View1);
这两个功能都如您所料,这两个模块的视图被解析并导航到,并且 View1 替换了主菜单视图。当我现在尝试从 View1 中的命令导航到 View2 时,导航中断。
regionManager.RequestNavigate(RegionNames.LeftRegion, ViewNames.View2);
但是,此 RequestNavigate 不起作用。视图未解析并添加到区域,因此导航不会发生。(该命令确实有效并且可以正常触发)
为什么模块 A 中的 View1 被解析并添加到了 View2 没有的区域?两个视图都以相同的方式注册和导航到。事实上,我可以更改顺序并首先导航到 View2,然后尝试 View1,然后 View2 将解决,但随后 View1 被破坏。ContainerControlledLifetimeManager 是否有一些我不知道的限制?
了解如何处理此导航的任何帮助都会有所帮助,我真的被困在哪里寻找它的来源,是 LifetimeManager 更改引入的问题,还是我注册或导航不正确?