我有一个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));
}
}
答案 0 :(得分:1)
可能在错误的轨道上思考这个问题。
我没有尝试从shell显示模块的视图,而是从moduleA模块订阅的shell中发布一个事件。然后我可以决定在模块中显示哪个视图。
希望这有帮助。