【问题标题】:How display multiple instances of a view using Prism and Unity如何使用 Prism 和 Unity 显示视图的多个实例
【发布时间】:2013-01-08 12:25:38
【问题描述】:

我正在开发一个使用 WPF、Unity 和 Prism 4 的 .Net 应用程序。该应用程序将包含一个在选项卡页上具有多个视图的 shell。该应用程序严重依赖名为 SystemTreeModule 的模块,该模块包含将出现在许多地方的SystemTreeView

我刚刚完成了我的第一个视图,其中定义了一个名为“SystemTreeRegion”的区域。在 SystemTreeModule 中,我在该区域注册了我的 SystemTreeView 实例。奇迹般有效! SystemTreeView 类型是使用 Unity 的自动发现功能发现的(因此它没有显式注册):

public void Initialize()
{
    _regionManager.RegisterViewWithRegion("SystemTreeRegion", () => _container.Resolve<SystemTreeView>());
}

现在是时候开始我要使用SystemTreeView 的第二个模块的工作了。当我在新视图中创建一个名为“SystemTreeRegion”的区域时,我感到非常自信,但它失败了,出现以下异常:

创建名为“SystemTreeRegion”的区域时发生异常。 例外是:System.ArgumentException:具有给定名称的区域已注册:SystemTreeRegion

所以我已经在 Google 和 StackOverflow 上搜索了答案,但我无法弄清楚你应该如何做到这一点!

我什至无法判断我是否只是遗漏了一些细节,或者我是否在概念上偏离了...

【问题讨论】:

    标签: c# .net wpf prism unity-container


    【解决方案1】:

    从概念上讲,您并没有走远。通过模块提供视图是完全可以的。但请记住,您的应用程序中只能有一个名为“SystemTreeRegion”的视图,否则 Prism 的区域管理器将不知道您要访问哪个视图。

    考虑到这一点 - 如果您尝试将视图注册到区域名称并希望该视图将出现在带有该名称的每个区域中,那么您在概念上是错误的。您只能将视图注册到一个区域。

    因此,只需确保每个区域都有自己唯一的名称,然后为该区域注册所需的视图,就可以了。

    【讨论】:

    • 只是对你上一句的澄清——你的意思是; “所以只需确保每个 区域 都有自己唯一的名称 [...]”?
    • 哎呀!感谢您指出了这一点。当然,每个区域都是有意义的。
    • 那么我在概念上是错误的。 :-/ 假设我为我想查看我的 SystemTreeView 的所有区域创建了唯一的区域名称。您是否会编写代码来为 SystemTreeModule 中的所有区域或在定义您希望 SystemTreeView 出现的区域的每个模块中注册视图?
    • 在我希望 SystemTreeView 出现的每个模块中 - 因为 SystemTreeModule 对依赖模块一无所知。 (注意:确保正确配置模块依赖项,以便 SystemTreeModule 在其他模块之前加载)
    • 所以我会写 _regionManager.RegisterViewWithRegion("SystemTreeRegionX", () => _container.Resolve());在每个需要 SystemTreeView 的模块中(区域名称 SystemTreeRegionX 因模块而异)。这意味着从每个模块对 SystemTreeModule 的引用,感觉“不好”。您如何处理出现在许多地方的常见视图 - 创建一个接口并使用 Unity 注册它,_container.RegisterType();?我们将实际测试 SystemTreeView 的不同实现,因此我们希望它易于交换。
    猜你喜欢
    • 2011-04-27
    • 2016-06-20
    • 1970-01-01
    • 2019-02-17
    • 2016-01-05
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多