复合WPF:显示/隐藏视图?

时间:2009-08-29 01:35:54

标签: prism

我正在加速复合WPF,构建一个小型演示应用程序来解决这些问题。我的应用程序有一个区域和两个模块,模块A和模块B.每个模块都包含一个简单的“Hello World”文本块。根据{{​​3}},这两个模块都按需加载设置。

外壳有两个按钮,“加载模块A”和“加载模块B”。单击按钮时,将加载相应的模块。所以,让我说点击“加载模块A”,然后“加载模块B”。模块A,然后模块B按预期加载。但如果我再次点击“加载模块A”,则没有任何反应。

我在这一点上陷入困​​境。我认为我的问题是我需要激活和停用模块中的视图,而不是使用按需加载。但我不知道该怎么做,我找不到任何谈论它的文档或博客。

所以,这是我的问题:如何加载/卸载(或显示/隐藏)视图?如果有人能指出我的示例代码,我真的很感激。谢谢你的帮助。

1 个答案:

答案 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
远见系统