从shell中加载一个prism模块视图,使用MEF

3

我有一个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个回答

1

可能之前的想法有些偏差。

与其试图从 shell 中展示模块的视图,我会从 shell 发布一个事件,让 moduleA 订阅该事件。然后我可以决定在模块本身中显示哪个视图。

希望这能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接