我试图找到以下方案的答案但未能得出答案。这可能是由于我自己承认,还没有完全掌握整个棱镜概念。在我的辩护中,我两天前才开始研究Prism,所以请保持温柔......
在阅读了大量文献后,我有以下设置:
Framework项目包含事件定义和有效负载等。
Shell项目在shell.xaml中有四个区域:
每个非Shell项目都引用了以下Prism程序集:
除了这些程序集之外,Shell项目还引用了:
每个项目都有对Framework项目的引用,但没有一个引用解决方案中的任何其他项目。
此时我想指出一切按计划进行!
在MainMenuView项目中,我有一些MenuItems,它们在MainMenuViewModel中有命令。
ViewModel使用EventAggregator发布在Framework项目中声明的几个事件。
在Shell项目中,ShellViewModel订阅这些事件,例如:
使用ContentControl作为“ContentRegion”的控件,我可以在TestContentA和TestContentB之间切换,没有任何问题。目前,TestContentA和TestContentB都是使用
注册的.RegisterViewWithRegion method(...)
我想做的是将TestContentA和TestContentB作为新的TabItem注入TabControl,而不是注入到ContentControl控件中。
所以shell.xaml现在包含一个TabControl以及一个名为“TabRegion”的进一步区域。然后我再次使用
将已注册的区域从 ContentRegion 更改为 TabRegion.RegisterViewWithRegion(...)
方法
我见过很多例子:
IRegion tabRegion = regionManager.Regions["TabRegion"];
var tabView1 = container.Resolve();
tabRegion.Add(tabView1, "FirstTabView");
我在ShellViewModel中没有Container,但即使我在这里有它,我仍然无法引用TestContentA视图,因为这是在另一个程序集中,它本身将在运行时找到。
与您可以在线找到的样本不同,其中要注入的视图似乎总是在示例项目中。
在Navigate方法中,如果我(出于调试目的)添加代码:
var tabRegion = regionManager.Regions["TabRegion"];
然后我可以看到tabRegion有一个View集合,在这个视图中我可以看到来自TestContentA和TestContentB的两个视图,这些视图告诉我视图已正确注册。问题是我不知道如何“抓住”它们以便我可以将一个新的视图实例注入一个TabItem。
如果我作弊并添加对TestContentA的引用,那么我只需添加视图即可显示TabItem。这也告诉我,我几乎就在那里但当然,没有人愿意参考。
总结一下,我的问题是:
如何从应用程序启动时发现的松耦合程序集中注入视图?
如果有人能指出我正确的方向,我很感激,因为我确信可以做到。
感谢您抽出宝贵时间阅读本文!
答案 0 :(得分:2)
您需要创建一个引导程序。 每个加载的模块都可以通过ServiceLocator获取区域管理器,然后将其视图注册到区域名称。这样,Shell项目不需要包含对视图的直接引用。