使用MEF从shell加载prism模块视图

我有一个shell项目,它将我的引导程序中的模块加载到我的shell主视图中的选项卡控件中。

我刚刚在我的标签项上实现了一个关闭按钮,现在提出了如何从shell重新加载模块视图的问题?

尝试使用

moduleManager.LoadModule("ModuleA"); 

但这仅在首次加载模块时有效。 当我调用上面的内容时,它会加载并初始化模块,显示视图。 如果我然后再次关闭视图,第二次我尝试这个它不会重新显示视图(我猜它不会重新初始化模块,因为它已经加载)。

所以,我虽然考虑过在shell中使用以下内容:

 var moduleAView = ServiceLocator.Current.GetInstance(); regionManager.Regions["TabRegion"].Add(ModuleAView); regionManager.Regions["TabRegion"].Activate(ModuleAView); 

这种方法的问题是我的shell如何知道第1行中的ModuleAView类型? 我没有对模块A的引用,也不想添加模块。 我想到了ModuleAView将实现的一个通用接口,它可以在模块和shell之间共享,但是在尝试使用上面的ServiceLocator.GetInstance方法时遇到了组合错误。

非常感谢您的帮助。

PS这是我试过的模块A模块代码。

 [ModuleExport(typeof(ModuleA), InitializationMode = InitializationMode.OnDemand)] [Module(ModuleName="ModuleA")] public class ModuleA : IModule { private IRegionManager _regionManager; [ImportingConstructor] public ModuleA(IRegionManager regionManager) { this._regionManager = regionManager; } public void Initialize() { // add the search view to the region manager. this._regionManager.RegisterViewWithRegion("TabRegion", typeof(Views.ModuleAView)); } } 

可能是在错误的轨道上思考这个问题。

我没有尝试从shell显示模块的视图,而是从shell发布了一个事件,该模块是模块订阅的。 然后我可以决定在模块本身显示什么视图。

希望这可以帮助。