【发布时间】:2020-02-03 15:45:18
【问题描述】:
您好,我正在尝试设置一种架构,在该架构中,启动应用程序时仅启动一个模块。然后我想根据用户的操作延迟加载其他模块。
为了在我的 app.xaml.cs 中实现这一点,我在引导时加载了一个模块 (MainModule),另一个具有 InitializationMode = InitializationMode.OnDemand
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
Type BlipModuleType = typeof(BlipModule);
moduleCatalog.AddModule(new ModuleInfo()
{
ModuleName = BlipModuleType.Name,
ModuleType = BlipModuleType.AssemblyQualifiedName,
InitializationMode = InitializationMode.OnDemand
});
moduleCatalog.AddModule<MainModule>();
}
然后我的主模块(正确显示视图)将一个视图注册到唯一可用的区域:
public class MainModule : IModule
{
private readonly IRegionManager _regionManager;
public MainModule(IRegionManager regionManager)
{
_regionManager = regionManager;
}
public void OnInitialized(IContainerProvider containerProvider)
{
_regionManager.RegisterViewWithRegion(RegionNames.ContentRegion, typeof(ViewA));
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
}
}
延迟加载的模块具有相同的结构,注册了不同的视图(如果我决定将它用作我的主模块,它可以正常工作)
public class BlipModule : IModule
{
private readonly IRegionManager _regionManager;
public BlipModule(IRegionManager regionManager)
{
_regionManager = regionManager;
}
public void OnInitialized(IContainerProvider containerProvider)
{
_regionManager.RegisterViewWithRegion(RegionNames.ContentRegion, typeof(ViewB));
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
}
}
最后我的 MainModule ViewA 的视图模型中有一个命令,它应该加载新模块并导航到它。
public class ViewAViewModel : BindableBase
{
const string BlipModuleName = "BlipModule";
public ReactiveCommand ChangeRoute { get; set; } = new ReactiveCommand();
public ViewAViewModel(IRegionManager regionManager, IModuleManager moduleManager)
{
ChangeRoute.Subscribe(res =>
{
moduleManager.LoadModule(BlipModuleName);
});
moduleManager.LoadModuleCompleted += (s, e) =>
{
if (e.ModuleInfo.ModuleName == BlipModuleName)
{
regionManager.RequestNavigate(RegionNames.ContentRegion, new Uri(BlipModuleName, UriKind.Relative));
}
};
}
}
BlipModule 的 viewB 实际已加载(如果我在视图的构造函数中设置断点,我会遇到问题),但不是视图,而是其中包含“System.Object”的白页。 任何想法?谢谢!
【问题讨论】: