zoukankan      html  css  js  c++  java
  • Prism源代码解析之区域管理器(IRegionManager)

    概要

    本文主要介绍Prism的IRegionManager, 主要分析源代码的执行流程, 来介绍内部实现的几个核心接口调用过程。
    通过本文, 你可以熟练的掌握Prism当中以下接口的作用以及使用方法, 如下所示:

    • IRgionManager
    • INavigationAware
    • INavigateAsync
    • IRegionNavigationService
    • IConfirmNavigationRequest
    • IRegionNavigationContentLoader

    阅读本文章, 您需要掌握一下基本概念:

    • 了解Prism的区域导航的大概用法
    • 了解如何在导航中传递参数

    正文

    首先, 通过一段简单的示例来展示IRegionManager调用导航的业务代码。

    //向RegionA区域当中导航ViewA页面, 并且传递参数名Value 值为Hello 的导航参数
    var param = new NavigationParameters();
    param.Add("Value", "Hello");
    
    regionManager.Regions["RegionA"].RequestNavigate("ViewA", param);
    

    对应在ViewA的DataContext中, 实现如下:

    public class ViewAViewModel : INavigationAware
        {
            public bool IsNavigationTarget(NavigationContext navigationContext)
            {
                return true;
            }
    
            public void OnNavigatedFrom(NavigationContext navigationContext)
            {  }
    
            public void OnNavigatedTo(NavigationContext navigationContext)
            {
                //接收导航传递的string类型参数值Value
                var hello = navigationContext.Parameters.GetValue<string>("Value");
            }
        }
    

    通过上面两段代码中, 可以看到, 通过IRegionManager实现了在指定区域导航页面并且传递参数的过程。那么接下来主要来通过源代码来解析整个导航流程,这里面涉及到多个接口的调用过程也会统一的介绍。

    IRegionManager

    该接口当中公开了一个Regions属性, 其中包含所有注册的区域, 另外则包含一些方法,AddToRegion、RegisterViewWithRegion、RequestNavigate 作用同样是向区域当中指定不同的页面。

    通过Regions, 我们可以通过索引器访问不同的区域并且直接调用RequestNavigate方法, 因为IRegion继承于INavigateAsync, INavigateAsync有RequestNavigate方法

    public interface INavigateAsync
    {
    void RequestNavigate(Uri target, Action<NavigationResult> navigationCallback);
    void RequestNavigate(Uri target, Action<NavigationResult> navigationCallback, NavigationParameters navigationParameters);
    }
    
    public interface IRegion : INavigateAsync
    {
    }
    

    IRegionNavigationService

    了解了IRegionManager 是通过INavigateAsync接口调用RequestNavigate来进行导航, 那么我们需要清楚的是, INavigateAsync具体的实现是在哪里, 这里就涉及到了一个导航服务
    的实现接口IRegionNavigationService , 该接口继承于INavigateAsync

    public interface IRegionNavigationService : INavigateAsync
    {
    }
    

    也就是说, 我们调用RequestNavigate, 其实是通过 IRegionNavigationService的具体实现类来完成整个导航过程, 接下来主要分析RegionNavigationService实现类。

    RegionNavigationService

    首先, 简单的描述整个导航需要执行的逻辑, 如下:
    1.构建导航的上下文(包含传递的参数,最终导航的页面)

    2.循环区域当中所有的活动视图, 并且执行继承于IConfirmNavigationRequest接口的实例
    注意: IConfirmNavigationRequest 主要用于在区域导航中的拦截功能。
    使用场景: 例如,当前页面显示A, 当你导航B的时候, A如果未保存,可以提示是否切换到B页面。

    3.循环区域当中所有的活动视图, 并且执行继承于 INavigationAware 接口的 OnNavigatedFrom方法。
    说明:调用OnNavigatedFrom方法,主要告诉活动的页面, 我现在要导航到指定页面, 这样你可以在OnNavigatedFrom当中编写你所需要的业务逻辑。

    4.向指定的区域当中添加对应的导航内容, 并且激活显示它。
    主要通过 IRegionNavigationContentLoader 接口的 LoadContent 方法来将内容添加到指定区域当中。
    注意: 这里会使用到INavigationAware接口当中的IsNavigationTarget方法, 如果该方法设置为true, 代表重用实例, 而不是重新初始化。

    5.记录导航日志 IRegionNavigationJournal
    说明: 通过导航日志, 我们可以实现在区域当中返回上一页以及下一页的功能。

    6.触发INavigationAware接口的OnNavigatedTo, 传递导航的数据上下文(包含导航服务、传递参数等)

    7.触发导航的回调方法navigationCallback, 如果存在的话,代码如下所示:

    regionManager.Regions["RegionA"].RequestNavigate("ViewA",
                    back =>
                {
                    if ((bool)back.Result)
                    {
                        //代表导航成功
                    }
                });
    

    8.Navigating与Navigated 事件为IRegionNavigationService接口当中的成员, 它们分别在导航的不同阶段触发该类事件。
    Navigating: 指定区域当中添加完视图后并且激活之前调用
    Navigated : 导航完成之后调用该事件

    整个流程图,如下图所示:

    总结

    通过分析RegionNavigationService, 可以了解到, 其内部的执行逻辑涉及到多个接口, 其中包含了多个接口的使用方法, 例如:

    1. INavigationAware接口的作用, 如何接收导航传递的参数, IsNavigationTarget可以重用页面实例, OnNavigatedFrom 可以接收导航过程的上下文
    2. IConfirmNavigationRequest接口的作用, 可以用于导航的拦截请求
    3. IRegionNavigationService接口的作用, 主要用于内部的区域导航服务
    4. IRegionNavigationContentLoader接口的作用, 主要用于向指定区域添加内容
    5. IRegionNavigationJournal接口的作用, 主要用于区域导航当中记录历史, 用于前后导航的, 返回上一页下一页。
  • 相关阅读:
    linux 邮件服务器
    Nginx学习之keepalive
    explain 和 desc 详解
    mysql 常用语句
    loop设备及losetup命令
    cryptsetup文件系统加密
    ftp主动与被动模式详解
    大型网站关键技术
    大访问量网站架构设计
    Mysql 的事务隔离级别
  • 原文地址:https://www.cnblogs.com/zh7791/p/15787447.html
Copyright © 2011-2022 走看看