如何在初始化后激活/取消激活模块的视图?

时间:2008-12-11 18:29:41

标签: wpf prism modularity cag

这涉及WPF或Prism的复合应用指南。

我的shell中有一个“MainRegion”。我的各种模块将被加载到这个主要区域。我可以在菜单中填充可用模块列表并选择它们进行加载。点击我做的菜单:

var module = moduleEnumerator.GetModule(moduleName);
moduleLoader.Initialize(new[] { module });

第一次一切正常,因为模块的Initialize()方法被执行,但是在Module1,Module2和Module3初始化之后,当我再次点击再加载Module2时没有任何反应。

我的问题:如何在执行初始化方法后按需激活模块?

感谢您的帮助!

4 个答案:

答案 0 :(得分:4)

您实际上并未激活模块。您激活区域中的视图。请阅读此article

Initialize方法仅对任何模块调用一次。当你调用LoadModule时,你看到模块中的视图被激活的事实我猜是因为Initilalize方法正在注册一个带有区域的视图。这将激活视图。如果您有多个视图,则最后注册的视图将是活动视图。

要激活视图,您需要调用区域的Activate方法(假设注入了IUnityContainer和IRegionManager)...

// Get a view from the container.
var view = Container.Resolve<MyView>();

// Get the region.
var region = RegionManager.Regions["MyRegion"];

// Activate the view.
region.Activate(view);

根据区域控制的类型,这将替换那里的视图或添加到它。

答案 1 :(得分:2)

您可以通过调用Regions的Remove方法删除View。

public void RemoveViewFromRegion(string viewName, string regionName, object defaultView)
    {
      IRegion region = regionManager.Regions[regionName];
      object view = region.GetView(viewName);
      region.Remove(view);
      region.Activate(defaultView); 
    }

答案 2 :(得分:0)

您应该拥有一个属于您所在地区的ContentControl。然后,您需要将所有模块添加到此区域。当您单击菜单时,您应该使用该区域的激活(...)方法来激活特定模块。

答案 3 :(得分:0)

这是否意味着当您激活模块时,可能与其重叠的其他模块设置为Visibility.Collapsed?