繁体   English   中英

Prism-从松散耦合的组件中注入视图

[英]Prism - Inject view from loosely-coupled assembly

我试图为以下情况找到答案,但未能给出答案。 我自己承认,这很可能是由于我尚未完全掌握整个棱镜概念。 为了辩护,我仅在两天前才开始调查Prism,所以请保持谨慎...

阅读大量文献后,我将进行以下设置:

  1. 框架项目
  2. 壳牌项目
  3. MainMenu项目(模块)
  4. SideMenu项目(模块)
  5. StatusBar项目(模块)
  6. TestContentA项目(模块)
  7. TestContentB项目(模块)

框架项目除其他外,还包含事件定义和有效负载。

Shell项目在shell.xaml中具有四个区域:

  • MainMenuRegion
  • SideBarRegion
  • StatusBarRegion
  • ContentRegion

每个非Shell项目都引用了以下Prism程序集:

  • Microsoft.Practices.Prism
  • Microsoft.Practices.ServiceLocation
  • Microsoft.Practices.Unity

Shell项目除了这些程序集之外,还引用了:

  • Microsoft.Practices.Prism.UnityExtensions

每个项目都引用了Framework项目,但是没有一个引用解决方案中的任何其他项目。

在这一点上,我想指出一切都按计划进行!

在MainMenuView项目中,我有一些MenuItems,这些菜单项在MainMenuViewModel中具有命令。

ViewEvent使用EventAggregator,发布在Framework项目中声明的几个Event。

在Shell项目中,ShellViewModel订阅以下事件,例如:

使用ContentControl作为“ ContentRegion”的控件,我可以毫无问题地在TestContentA和TestContentB之间切换。 目前,TestContentA和TestContentB都使用

.RegisterViewWithRegion method(...)

我想做的是将TestContentA和TestContentB作为新的TabItem注入到TabControl中,而不是注入到ContentControl控件中。

因此,shell.xaml现在包含一个TabControl以及一个名为“ TabRegion”的进一步区域。 然后,我再次通过使用将注册的Region从ContentRegion更改为TabRegion

.RegisterViewWithRegion(...)

方法。

我看过很多例子,例如:

IRegion tabRegion = regionManager.Regions["TabRegion"];
var tabView1 = container.Resolve();
tabRegion.Add(tabView1, "FirstTabView");

我在ShellViewModel中没有容器,但是即使在这里没有容器,我仍然不能引用TestContentA视图,因为它位于另一个程序集中,而该程序集本身将在运行时找到。

与您可以在网上找到的示例不同,要注入的视图始终似乎在示例项目中。

在Navigate方法中,如果我(出于调试目的)添加代码:

var tabRegion = regionManager.Regions["TabRegion"];

然后我可以看到tabRegion有一个View集合,并且在此视图中,我可以看到来自TestContentA和TestContentB的两个视图,告诉我这些视图已正确注册。 问题是我不知道如何“抓住”它们,以便可以将视图的新实例作为TabItem注入。

如果我作弊并添加对TestContentA的引用,则只需添加视图,TabItem就会出现。 这也告诉我,我快到了,但是当然不希望引用。

综上所述,我的问题是:

我如何从应用程序启动时发现的松耦合组件中注入视图?

如果有人可以指出正确的方向,我将不胜感激,因为我相信这是可以做到的。

感谢您抽出时间来阅读!

您将需要创建一个引导程序。 每个加载的模块都可以通过ServiceLocator获取区域管理器,然后将其视图注册到区域名称。 这样,Shell项目就不需要直接引用您的视图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM