使用 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