我使用PRISM框架创建了一个项目。我有一些模块,我可以在shell中注册和显示,这很好。我需要做的是在从事件聚合器收到特定事件时动态显示和隐藏模块。
我触发应该接收的DisplayModule事件并隐藏现有模块并显示一个新模块,但我的问题是我应该在哪里接收此事件并显示模块?贝壳?如果是这样,我将如何做到这一点,因为shell是顶级的,似乎不会继承所需的Unity方法。
我还以为我可以有一个单独的模块来监听DisplayModule事件,并使用区域管理器隐藏上一个模块并显示新模块。这需要引用所有其他模块才能解析它们的类型,这是不好的做法吗?
希望这是有道理的。
谢谢你的时间
答案 0 :(得分:4)
但是,您无法卸载整个模块。您可以动态加载一个,但不能卸载一个。有关更多信息,请阅读以下文章中的按需加载模块:http://msdn.microsoft.com/en-us/library/dd458911.aspx
假设:我将首先假设当您说要卸载模块时,您实际上只是希望从您的应用程序中删除所有视图。
首先,我们来谈谈您的模块如何工作以及它们如何在您的shell上显示其内容。
您的shell将有一个或多个区域,模块可以在初始化时注册视图。
public MyFirstModule : IModule
{
IRegionManager _mgr;
public MyFirstModule(IRegionManager mgr)
{
_mgr = mgr;
}
public void Initialize()
{
_mgr.RegisterViewWithRegion("MainRegion", typeof(MyView));
}
}
可以做的是更改模块初始化以跟踪已在此模块中注册的视图,并在适当时卸载它们。
public MyFirstModule : IModule
{
IRegionManager _mgr;
IEventAggregator _agg;
IUnityContainer _container;
public MyFirstModule(IRegionManager mgr,
IEventAggregator agg,
IUnityContainer container)
{
_mgr = mgr;
_agg = agg;
_container = container;
}
List<object> Views = new List<object>();
public void Initialize()
{
_mgr.RegisterViewWithRegion("MainRegion", () =
{
MyView view = _container.Resolve<MyView>();
//Track this view so I can remove it if needed
Views.Add(view);
return view;
});
_agg.GetEvent<UnloadModuleRequest>.Subscribe(RemoveViews,
ThreadOptions.UIThread);
}
private void RemoveViews(string moduleToUnload)
{
//If this is true, that means the Shell is asking
//me to unload, so I will remove any views I've
//registered from any regions they were registered to
if(moduleToUnload == "MyFirstModule")
{
foreach(object view in Views)
{
_mgr.Regions["MainRegion"].Remove(view);
}
}
}
}
通过这种方式,您的Shell可以发布名为UnloadModuleRequest
(类型为CompositePresentationEvent<string>
)的事件,并让任何模块监听卸载它已注册的任何视图。
我希望这接近你想要的。
答案 1 :(得分:2)
以下主题处理类似情况并解释实现目标的可能方法:
如果有帮助,请告诉我。
Damian Schenkelman http://blogs.southworks.net/dschenkelman