我正在加速复合WPF,构建一个小型演示应用程序来解决这些问题。我的应用程序有一个区域和两个模块,模块A和模块B.每个模块都包含一个简单的“Hello World”文本块。根据{{3}},这两个模块都按需加载设置。
外壳有两个按钮,“加载模块A”和“加载模块B”。单击按钮时,将加载相应的模块。所以,让我说点击“加载模块A”,然后“加载模块B”。模块A,然后模块B按预期加载。但如果我再次点击“加载模块A”,则没有任何反应。
我在这一点上陷入困境。我认为我的问题是我需要激活和停用模块中的视图,而不是使用按需加载。但我不知道该怎么做,我找不到任何谈论它的文档或博客。
所以,这是我的问题:如何加载/卸载(或显示/隐藏)视图?如果有人能指出我的示例代码,我真的很感激。谢谢你的帮助。
答案 0 :(得分: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
远见系统