2011-01-06 112 views
2

當我的應用程序加載並讓他們將視圖放入Shell(主視圖)中的region(另請參閱this MSDN article)時,我想要加載模塊。我目前正在按需加載模塊,它工作得很好。 (I加載模塊與調用this.moduleManager.LoadModule("ModuleB");其中moduleManager被定義爲[Import(AllowRecomposition = false)] private IModuleManager moduleManager;一個按鈕此所有來自ModularityWithMef.Desktop示例應用程序。)這裏的相關代碼:在棱鏡區域顯示模塊

模塊

[ModuleExport(typeof(ModuleB), InitializationMode = InitializationMode.OnDemand)] 
public class ModuleB : IModule 
{ 
    [Import(AllowRecomposition = false)] private IRegionManager _regionManager; 

    /// <summary> 
    /// Initializes a new instance of the <see cref="ModuleB"/> class. 
    /// </summary> 
    public ModuleB() 
    { 
    } 

    /// <summary> 
    /// Notifies the module that it has be initialized. 
    /// </summary> 
    public void Initialize() 
    { 
     _regionManager.AddToRegion("ContentRegion", new ModuleBView()); 
    } 
} 

XAML區域

<TabControl Regions:RegionManager.RegionName="ContentRegion" /> 

當我改變加載模塊時,可用( [ModuleExport(typeof(ModuleB), InitializationMode = InitializationMode.WhenAvailable)]),當引導程序創建Shell時,我得到一個ModuleInitializeException:「這個RegionManager不包含名稱爲'ContentRegion'的區域。」這告訴我,在Shell中創建區域和模塊的初始化存在計時問題。

因此,這裏是我的問題:如何在發現時將Shell的區域註冊到模塊視圖,而無需使用OnDemand初始化並手動加載模塊?

回答

2

那麼這是一個簡單的答案,因爲某些原因,我很難找到。 IRegionManager提供了一個RegisterViewWithRegion方法,它接受一個返回視圖的函數。這允許區域管理器在準備就緒時實例化視圖(而不是使用AddToRegion,這會立即發生)。所以關鍵是使用方法在模塊的例行Initialize

public void Initialize() 
{ 
    _regionManager.RegisterViewWithRegion("ContentRegion",() => new ModuleBView()); 
} 

當我搞清楚了這一點,我也想出了一個解決方法。當模塊設置爲InitializationMode.OnDemand時,Shell可以導入IModuleManager並在ContentRendered事件中使用LoadModule。這確保該區域已被添加到區域管理器,並且該模塊可以毫無問題地添加其視圖。如果您需要通過可用的模塊進行迭代,使用此事件處理程序:

public Shell() 
{ 
    InitializeComponent(); 

    ContentRendered += (o, eventArgs) => 
     { 
      foreach (var moduleInfo in _moduleCatalog.Modules) 
      { 
       _moduleManager.LoadModule(moduleInfo.ModuleName); 
      } 
     }; 
} 
+0

感謝發佈。 :) – VipX1 2014-02-10 16:16:38

0

我傾向於歡暢的引導程序視圖和地區,在 AggregateCatalog.Changed _handler - 這是你知道你的模塊已經加載並且Shell已經與所有模塊實例化。