使用MEF从shell加载棱镜模块视图

时间:2011-12-20 09:35:47

标签: c# prism mef

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

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

尝试使用

moduleManager.LoadModule("ModuleA");

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

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

var moduleAView = ServiceLocator.Current.GetInstance<ModuleAView>();
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));
    }
}

1 个答案:

答案 0 :(得分:1)

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

我没有尝试从shell显示模块的视图,而是从moduleA模块订阅的shell中发布一个事件。然后我可以决定在模块中显示哪个视图。

希望这有帮助。