[英]Prism - Inject view from loosely-coupled assembly
我試圖為以下情況找到答案,但未能給出答案。 我自己承認,這很可能是由於我尚未完全掌握整個棱鏡概念。 為了辯護,我僅在兩天前才開始調查Prism,所以請保持謹慎...
閱讀大量文獻后,我將進行以下設置:
框架項目除其他外,還包含事件定義和有效負載。
Shell項目在shell.xaml中具有四個區域:
每個非Shell項目都引用了以下Prism程序集:
Shell項目除了這些程序集之外,還引用了:
每個項目都引用了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.