2009-08-29 32 views
1

私はコンポジットWPFでスピードアップし、問題を解決するための小さなデモアプリケーションを構築しています。私のアプリには1つの領域と2つのモジュール、モジュールAとモジュールBがあります。各モジュールには単純な "Hello World"テキストブロックが含まれています。両方のモジュールは、this MSDN How-Toのようにロードオンデマンドとしてセットアップされています。複合WPF:ビューの表示/非表示?

シェルには、「ロードモジュールA」と「ロードモジュールB」の2つのボタンがあります。ボタンをクリックすると、対応するモジュールがロードされます。ですから、 "Load Module A"をクリックし、 "Module Bをロード"をクリックします。モジュールA、次にモジュールBは期待どおりにロードされます。しかし、 "Load Module A"を再度クリックすると、何も起こりません。

私はこの時点で固執しています。私の問題は、ロード・オン・デマンドを使用するのではなく、モジュールのビューをアクティブ化および非アクティブ化する必要があることだと思います。しかし、私はそれをどうやって行うのか分かりませんし、それについて話すドキュメンテーションやブログを見つけることはできません。

これは私の質問です:ビューをロード/アンロード(または表示/非表示)する方法は?誰かが私にサンプルコードを指すことができれば、本当に感謝しています。ご協力いただきありがとうございます。

答えて

5

私の答えが見つかりました。この方法は次のとおりです。起動時にすべてのモジュールを読み込み、必要に応じてビューを有効または無効にします。私はこの問題をCodeProjectの記事として書いていますが、これを行う方法の概要を以下に示します。

(1)モジュールInitialize()メソッドでモジュールを追加しますが、

public void Initialize() 
{ 
    // Get main region 
    var mainRegion = m_RegionManager.Regions["MainRegion"]; 

    // Load Module B 
    var newView = new ModuleBView(); 
    mainRegion.Add(newView, "ModuleA.ModuleAView"); 
} 

Add()メソッドには2つのパラメータがあります。 2番目のパラメータはビューの名前で、ビューのToString()メソッドによって生成された値に設定されます。なぜ次のステップに進むのかが分かります。

(2)ビューをアクティブにするとき、前のビューを非アクティブにする必要があります。しかし、我々は、ビューの名前を知らないかもしれないので、我々は、すべてのアクティブなビューを無効化:

public static void ClearRegion(IRegion region) 
{ 
    // Get existing view names 
    var oldViewNames = new List<string>(); 
    foreach (var v in region.Views) 
    { 
     var s = v.ToString(); 
     oldViewNames.Add(s); 
    } 

    // Remove existing views 
    foreach (var oldViewName in oldViewNames) 
    { 
     var oldView = region.GetView(oldViewName); 
     region.Deactivate(oldView); 
    } 
} 

私たちは、それぞれの名前を設定しているのでそのToStringメソッド()値に等しい表示、我々は何も知らなくても簡単に名前を得ることができます彼らについては事前に

(3)次に、新しいビューをアクティブにします。

public void Execute(object parameter) 
{ 
    // Get main region 
    var mainRegion = m_ViewModel.RegionManager.Regions["MainRegion"]; 

    // Clear region 
    ModuleServices.ClearRegion(mainRegion); 

    // Activate Module A view 
    var moduleAView = mainRegion.GetView("ModuleA.ModuleAView"); 
    mainRegion.Activate(moduleAView); 
} 

うまくいけば、あなたが軌道に乗るには十分だろう:私はMVVM ICommand.Execute()メソッドでそれを行います。私が言ったように、私はCodeProjectのデモコードを使ってより完全な書き出しを行う予定です。

David Veeneman
Foresight Systems

関連する問題