我找到了我的答案。以下是方法:在啓動時加載所有模塊,然後根據需要激活和取消激活視圖。我將把這個問題寫成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