我试图找到以下方案的答案,但未能提出答案。这很可能是由于我自己的承认,还没有完全掌握整个棱镜概念。在我的辩护中,我仅两天前就开始研究棱镜,所以请保持温柔...
阅读了许多文献后,我有以下设置:
- 框架项目
- 壳项目
- Mainmenu项目(模块)
- sidemenu项目(模块)
- 状态栏项目(模块)
- TestContenta项目(模块)
- TestContentB项目(模块)
框架项目包括事件定义和有效载荷。
外壳项目在shell.xaml中具有四个区域:
- 大型Menuregion
- sidebarregion
- statusbarregion
- Content Region
每个非壳项目都提到以下棱镜组件:
- microsoft.practices.prism
- microsoft.practices.servicelecote
- microsoft.practices.unity
外壳项目除了这些组件外,还引用:
- microsoft.practices.prism.unityextensions
每个项目都有对框架项目的引用,但是没有一个参考解决方案中的任何其他项目。
在这一点
在Mainmenuview项目中,我有一些Menuitems在MainmenuviewModel中具有命令。
使用EventAggregator的ViewModel在框架项目中发布了几个事件。
在Shell项目中,ShellViewModel订阅了这些事件,例如:
使用ContentControl作为" ContentRegion"的控件,我可以在TestContenta和TestContentB之间切换,毫无问题。目前,也使用
进行了testContenta和testContentB的注册.RegisterViewWithRegion method(...)
我想做的就是将TestContenta和TestContentB注入TabControl,作为新的TabItem,而不是进入ContentControl控件。
so shell.xaml现在包含一个TabControl以及一个名为" TabRigion"的未来区域。然后,我再次使用
将注册区域从 contentrigion 更改为 tabregion.RegisterViewWithRegion(...)
方法。
我看到了很多示例:
IRegion tabRegion = regionManager.Regions["TabRegion"];
var tabView1 = container.Resolve();
tabRegion.Add(tabView1, "FirstTabView");
我没有ShellViewModel中的容器,但是即使我在这里确实有它,我仍然无法参考TestContenta视图,因为这是在另一个组件中,在运行时可以找到。
。与您可以在线找到的样本不同,要注入的视图总是在示例项目中。
在导航方法中,如果我(用于调试目的)添加代码:
var tabRegion = regionManager.Regions["TabRegion"];
然后,我可以看到TabRigion有一个视图集合,在此视图中,我可以看到TestContenta和TestContentB的视图,告诉我视图已正确注册。问题是我不知道如何"抓住"它们,以便我可以将视图的新实例注入tabitem。
如果i 作弊并将引用添加到testContenta,那么我可以简单地添加视图,然后将出现tabitem。这也告诉我我几乎在那里,但是当然,不希望参考。
总结一下,我的问题是:
如何从启动应用程序启动时发现的松散耦合组件中注入视图?
如果有人可以将我指向正确的方向,我会很感激。
感谢您抽出宝贵的时间阅读!
您需要创建一个bootstrapper。每个已加载的模块可以通过ServiceLocator获取区域管理器,而不是将其视图注册到区域名称。这样,Shell项目就不需要包含对您视图的直接引用。