2008-12-11 98 views
3

这涉及WPF或Prism的复合应用程序指南。如何在初始化后激活/取消激活模块视图?

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

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

在第一时间都工作正常,因为模块的初始化()方法执行,但经过模块1,单词数和单词数初始化时,没有任何反应我时单击以再次加载Module2。

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

谢谢你的帮助!

回答

4

您实际上并未激活模块。您激活某个地区的视图。读一读这个article

对于任何模块,Initialize方法只被称为一次。事实上,当你调用LoadModule时,你会看到模块中的一个视图被激活,我猜测这是由于Initilalize方法注册了一个区域的视图。这将激活视图。如果您有多个视图,则最后注册的视图将是活动视图。

激活您需要调用区域的激活方法的视图(假设注入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); 

根据区域控制的类型,这将是替换认为在那里或添加到它。

+0

要怎么停用?你的建议是什么? – 2009-05-25 03:11:29

0

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

0

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

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