当前位置:  开发笔记 > 编程语言 > 正文

如何加载模块并导航到模块?棱镜

如何解决《如何加载模块并导航到模块?棱镜》经验,为你挑选了1个好方法。

我有两个模块:ModuleLoggingModuleItems.我的Shell声明:


   
    
                         
   

    

首先ModuleLogging加载.然后,如果用户已通过身份验证,我想加载ModuleItems.正如我所理解的那样,我应该实例化

我的bootstrapper类:

protected override IModuleCatalog CreateModuleCatalog()
{
   ModuleCatalog catalog = new ModuleCatalog();
   catalog.AddModule(typeof(ModuleLogging));
   //I've not added ModuleItems as I want to check whether the user is authorized
   return catalog;
}   

我试图打电话ModuleItemsModuleLogging:

Uri viewNav = new Uri("ModuleItems", UriKind.Relative);
regionManager.RequestNavigate(RegionNames.TheUpperRegion, viewNav);
regionManager.RequestNavigate(RegionNames.TheBottomRegion, viewNav); 

但我LoggingViewModuleLogging不会被取代ToolBarViewModuleItemsDockingViewModuleItems.我只是分别在ContentControls中看到 System.ObjectSystem.Object不是LoggingView透明控件.

是的,我知道记忆中没有物体,比如ModuleItems.

如何按需加载模块并导航到视图?



1> pangabiMC..:

您可能需要对它们进行排序以使其正常工作:

将模块添加到目录中

按需加载模块

注册将在区域中显示的视图(或视图模型)

请求导航到您的视图

我们按顺序看看

将模块添加到目录中

我没有看到没有任何理由不将您的模块添加到目录中,但是在认证之后您可能不想要的是初始化模块.要按需要初始化模块,可以使用标志将其添加到目录中OnDemand:

模块将在请求时初始化,而不是在应用程序启动时自动初始化.

在你的引导程序中:

protected override void ConfigureModuleCatalog()
{
    Type ModuleItemsType = typeof(ModuleItems);
    ModuleCatalog.AddModule(new ModuleInfo()
    {
        ModuleName = ModuleItemsType.Name,
        ModuleType = ModuleItemsType.AssemblyQualifiedName,
        InitializationMode = InitializationMode.OnDemand
    });

按需加载模块

然后在身份验证成功后,您可以初始化您的模块:

private void OnAuthenticated(object sender, EventArgs args)
{
    this.moduleManager.LoadModule("ModuleItems");    
}

其中moduleManager是一个实例Microsoft.Practices.Prism.Modularity.IModuleManager(最好注入你的类构造函数)

注册您的视图

您还需要注册要在容器中导航到的视图(或者如果您正在使用viewmodel-first的viewmodel).执行此操作的最佳位置可能是模块ModuleItems的初始化,只需确保在其构造函数中注入容器:

public ModuleItems(IUnityContainer container)
{
    _container = container;
}

public void Initialize()
{
    _container.RegisterType(typeof(ToolBarView).FullName);
    _container.RegisterType(typeof(DockingView).FullName);
    // rest of initialisation
}

请注意,为了使RequestNavigate工作,您必须将视图注册为对象,并且还必须提供其全名作为name参数.

同时使用Module作为导航目标(就像你在这里做的那样:Uri viewNav = new Uri("ModuleItems", UriKind.Relative);可能不是最好的主意.模块对象通常只是一个临时对象,默认情况下,一旦你的模块被初始化就被抛弃了.

请求导航

最后,一旦你的模块加载,你可以请求导航.您可以使用上面提到的moduleManager来挂钩LoadModuleCompleted事件:

this.moduleManager.LoadModuleCompleted += (s, e)
    {
        if (e.ModuleInfo.ModuleName == "ModuleItems")
        {
            regionManager.RequestNavigate(
                RegionNames.TheUpperRegion,
                typeof(ToolBarView).FullName), 
                result => 
                { 
                   // you can check here if the navigation was successful
                });

            regionManager.RequestNavigate(
                RegionNames.TheBottomRegion,
                typeof(DockingView).FullName));
        }
    }

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有