【问题标题】:Navigation between lazy loaded modules with Prism and WPF使用 Prism 和 WPF 在延迟加载的模块之间导航
【发布时间】: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”的白页。 任何想法?谢谢!

【问题讨论】:

    标签: wpf prism


    【解决方案1】:

    你想RegisterForNavigation 而不是RegisterViewWithRegion

    【讨论】:

    • 我尝试使用RegisterForNavigation,但我的代码没有运气。但是您让我走上了正确的道路,我犯的另一个错误是请求导航到模块而不是视图。因此,在我的 viewModel 中,我将 regionManager.RequestNavigate(RegionNames.ContentRegion, new Uri("BlipModule", UriKind.Relative)); 更改为 regionManager.RequestNavigate(RegionNames.ContentRegion, new Uri("BlipView", UriKind.Relative));,它成功了。谢谢!
    • 名称是任意的,因此实际上您可以为视图使用模块名称。只需在注册视图时传递所需的名称即可覆盖默认名称,即视图类型的名称。
    • 是的,当然,但我的意思是我实际上是在使用模块的名称进行导航,而不是视图名称(除了我选择用于表示模型和视图的字符串内容)。跨度>
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 2019-08-02
    • 1970-01-01
    • 2018-10-14
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    相关资源
    最近更新 更多