2009-08-29 102 views
1

我正在加快Composite WPF的速度,構建一個小型演示應用程序來解決問題。我的應用程序有一個區域和兩個模塊,模塊A和模塊B.每個模塊都包含一個簡單的「Hello World」文本塊。根據this MSDN How-To,這兩個模塊都設置爲按需加載。複合WPF:顯示/隱藏視圖?

外殼有兩個按鈕,「加載模塊A」和「加載模塊B」。當點擊一個按鈕時,相應的模塊被加載。所以,可以說我點擊「加載模塊A」,然後點擊「加載模塊B」。模塊A,然後按預期模塊B加載。但是如果我再次點擊「加載模塊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()方法有兩個參數。第二個參數是視圖的名稱,我們將其設置爲視圖的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)現在我們激活新視圖。我在MVVM ICommand.Execute()方法中執行它:

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); 
} 

希望這足以讓你走。就像我說的那樣,我打算爲CodeProject做一個更完整的書寫和演示代碼。

David Veeneman
Foresight Systems