2011-01-06 11 views
2

アプリが読み込まれたときにモジュールを読み込み、シェル(メインビュー)のregionthis MSDN articleも参照)に表示したいとします。私は現在、オンデマンドでモジュールをロードしており、うまく動作します。 (私はmoduleManager[Import(AllowRecomposition = false)] private IModuleManager moduleManager;のように定義されてthis.moduleManager.LoadModule("ModuleB");を呼び出すボタンでモジュールをロードこれは、すべての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領域が

利用可能なモジュールを読み込むように変更すると[ModuleExport(typeof(ModuleB), InitializationMode = InitializationMode.WhenAvailable)])、ブートストラップがShellを作成しているときに "This RegionManagerに 'ContentRegion'という名前のリージョンが含まれていないとModuleInitializeExceptionが発生します。これは、シェル内の領域の作成とモジュールの初期化にタイミングの問題があることを示しています。 OnDemand初期化を使用せずに手動でモジュールをロードする必要がなく、モジュールのビューをシェルの領域に登録するにはどうすればよいですか?

答えて

2

これは簡単な答えでしたが、何らかの理由で見つけにくかったです。 IRegionManagerには、ビューを返す関数をとるRegisterViewWithRegionメソッドが用意されています。これにより、リージョンマネージャは準備ができた時点でビューをインスタンス化できます(AddToRegionを使用するのではなく、すぐに実行されます)。だから、キーがモジュールのInitializeルーチンでそのメソッドを使用することです:

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

私はこれを考え出すたが、私はまた、回避策を思い付きました。モジュールがInitializationMode.OnDemandに設定されている場合、シェルはIModuleManagerをインポートし、ContentRenderedイベントでLoadModuleを使用できます。これにより、リージョンがリージョン・マネージャーに追加され、モジュールが問題なくビューを追加できるようになります。あなたが利用可能なモジュールを反復処理する必要がある場合は、このイベントハンドラを使用します。 は_handler AggregateCatalog.Changedで、私は、ブートストラップのビューや地域メリーする傾向がある

public Shell() 
{ 
    InitializeComponent(); 

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

投稿していただきありがとうございます。 :) – VipX1

0

を - これはあなたがいることを知っているあなたのモジュール既にロードされており、Shellはすでにすべてのモジュールでインスタンス化されています。

関連する問題