使用 Prism 和 WPF 在延迟加载模块之间导航
Navigation between lazy loaded modules with Prism and WPF
您好,我正在尝试设置一种体系结构,在该体系结构中,当应用程序启动时只有一个模块被启动。然后我想根据用户的操作延迟加载其他模块。
为了在我的 app.xaml.cs 中实现这一点,我在 bootstrap 时间加载了一个模块(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" 的白页。
任何的想法?谢谢!
您想 RegisterForNavigation
而不是 RegisterViewWithRegion
。
您好,我正在尝试设置一种体系结构,在该体系结构中,当应用程序启动时只有一个模块被启动。然后我想根据用户的操作延迟加载其他模块。
为了在我的 app.xaml.cs 中实现这一点,我在 bootstrap 时间加载了一个模块(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" 的白页。 任何的想法?谢谢!
您想 RegisterForNavigation
而不是 RegisterViewWithRegion
。