这涉及WPF或Prism的复合应用指南。
我的shell中有一个“MainRegion”。我的各种模块将被加载到这个主要区域。我可以在菜单中填充可用模块列表并选择它们进行加载。点击我做的菜单:
var module = moduleEnumerator.GetModule(moduleName);
moduleLoader.Initialize(new[] { module });
第一次一切正常,因为模块的Initialize()方法被执行,但是在Module1,Module2和Module3初始化之后,当我再次点击再加载Module2时没有任何反应。
我的问题:如何在执行初始化方法后按需激活模块?
感谢您的帮助!
答案 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?