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类型参数值Valuevar 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 : 导航完成之后调用该事件

整个流程图,如下图所示:
35935e8488d1b8341502d431327dc3d5.png

总结

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

  1. INavigationAware接口的作用, 如何接收导航传递的参数, IsNavigationTarget可以重用页面实例, OnNavigatedFrom 可以接收导航过程的上下文

  2. IConfirmNavigationRequest接口的作用, 可以用于导航的拦截请求

  3. IRegionNavigationService接口的作用, 主要用于内部的区域导航服务

  4. IRegionNavigationContentLoader接口的作用, 主要用于向指定区域添加内容

  5. IRegionNavigationJournal接口的作用, 主要用于区域导航当中记录历史, 用于前后导航的, 返回上一页下一页。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微博与Redis系统技术文章记录

Redis 持久化&#xff0c;有两种&#xff1a; rdb 和 aof&#xff0c; rdb是记录一段时间内的操作&#xff0c;一盘的配置是一段时间内操作超过多少次就持久化。 aof可以实现每次操作都持久化。 这里我们使用aof。 配置方式&#xff0c;打开redis的配置文件。找到appendonly。…

求字符串里面数字之和

无意看到别人面试问了很简单的问题,求字符串里面数字之和,所以自己来实现下。 例子: 比如字符串:aaaa13sseui9ddu78ff4sss 里面的字符串数字是13、9、78、4 得到的和为104 代码如下: package com.sangfor.tree;public class SumByString {public static int sumByStri…

android用于打开各种文件的intent

import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.net.Uri.Builder; import java.io.File; import android.content.Intent; //自定义android Intent类&#xff0c; //可用于获取打开以下文件的intent //PDF,PPT,WORD,EXC…

Android后台强制结束进程,Application入口或者activity回调的是哪个方法?

问题描述dengdeng 解决方案1如果是系统强制结束&#xff0c;不会调用的 转载于:https://www.cnblogs.com/yiguobei99/p/4002126.html

python mysql数据库_Python3中操作MySQL数据库

0.安装 pip install pymysql 1.打开数据库连接 import pymysql db pymysql.connect(host"数据库地址", user"用户名", password"密码", port"端口", database"数据库名", charsetutf8) 2.创建游标 cursor db.cursor() 3.操…

日本的电视节目到底能有多特别?

1 是不是设计师忘了开扇窗&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 路灯&#xff1a;&#xff1f;&#xff1f;&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 当代大学生的真实水平&#xff08;素材来源网络&#xff0…

记一次 Oracle无法连接 问题分析

前言今天&#xff0c;同事告诉我&#xff0c;有台Oracle服务器异常断电&#xff0c;重启后发现无法连接了。分析过程1.检查服务状态查看Oracle的listerner服务和service服务&#xff0c;发现都是正在运行状态&#xff0c;说明服务是正常的。2.检查端口状态在客户机上使用&#…

最详细的最小堆构建、插入、删除的过程图解

转载&#xff1a;http://blog.csdn.net/hrn1216/article/details/51465270 1.简介 最小堆是一棵完全二叉树&#xff0c;非叶子结点的值不大于左孩子和右孩子的值。本文以图解的方式&#xff0c;说明 最小堆的构建、插入、删除的过程。搞懂最小堆的相应知识后&#xff0c;最大堆…

为什么要清除浮动

父元素的高度是由子元素撑开的&#xff0c;且子元素设置了浮动&#xff0c;父元素没有设置浮动&#xff0c;子元素脱离了标准的文档流&#xff0c;那么父元素的高度会将其忽略&#xff0c;如果不清除浮动&#xff0c;父元素会出现高度不够&#xff0c;那样如果设置border或者ba…

sublime编辑python_在没有安装Python的前提下,让Sublime text编辑器来运行Py?

sublime text 自带 python 解释器, 可以用来执行 python 代码. 但是 它的环境与标准的就有差异了, 例如, 安装第三方库可能遇到问题, 运行 pip 会出错 sublime 开着, 这个解释器就一直在执行, 而不是每个 python 程序启动独立的解释器 可以写一个 sublime text 插件, 获取当前文…

初探mysql数据库模式(一)

数据库模式是什么&#xff1f; 数据库模式是描述整个数据库的数据结构和数据库底层架构的事务。它分为逻辑模式&#xff08;俗称&#xff1a;“模式”&#xff09;&#xff0c;外模式(俗称&#xff1a;“子模式”or“用户模式”)&#xff0c;内模式(俗称&#xff1a;“存…

Kubernetes:标签、选择器、注解、容忍度、亲和性

在前面的学习中&#xff0c;我们学到了 Deployment 部署&#xff0c;以及副本数(ReplicaSet)&#xff0c;但是 Pod 部署到哪个 Worker 节点是随机的&#xff0c;即使有 3个 Woker 和 3个 Pod 副本&#xff0c;不一定每个 Node 刚刚好运行一个 Pod&#xff0c;也可能其中一个 No…

数学界最恐怖的存在!54张图读懂2600年数学史,看完跪下了......

全世界只有3.14 % 的人关注了爆炸吧知识“中国现代数学之父”华罗庚曾说过宇宙之大&#xff0c;粒子之微火箭之速&#xff0c;化工之巧地球之变&#xff0c;生物之谜日用之繁&#xff0c;无处不用数学回首往昔数学始终伴随我们左右纵横交错的几何、繁琐复杂的运算难以求解的方程…

R中大数据量数据框的合并慎重使用rbind

最近在用R处理百万级的数据&#xff0c;程序本身是线性扫描&#xff0c;可是随着数据量的增加&#xff0c;运行时间却不是线性增加&#xff0c;一度几天都运行不完。 怀疑是其中rbind函数造成的&#xff0c;查询到这篇文章&#xff0c;也说了这个问题 http://blog.sina.com.cn/…

realloc函数使用总结

realloc原型是extern void *realloc(void *mem_address, unsigned int newsize); 函数说明 语法 指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。 新的大小可大可小(但是要注意,如果新的大小小于原内存大小,可能会导致数据丢失,慎用!) 头文件 #incl…

const constexpr C++ 解释

中的const可用于修饰变量、函数&#xff0c;且在不同的地方有着不同的含义&#xff0c;现总结如下。 const的语义 C中的const的目的是通过编译器来保证对象的常量性&#xff0c;强制编译器将所有可能违背const对象的常量性的操作都视为error。 对象的常量性可以分为两种&#x…

python顺序结构实验设计_Python程序设计实验报告二:顺序结构程序设计

安徽工程大学 Python程序设计实验报告 班级 物流192 姓名 周立 学号 3190505227成绩 日期 3月4日 指导老师修宇 实验二 顺序结构程序设计&#xff08;验证性实验&#xff09; 【实验目的】 &#xff08;1&#xff09;掌握数据的输入输出的方法&#xff1b; &#xff08;2&#…

寒窗苦读十多年,我的毕业论文只研究了一个「屁」

全世界只有3.14 % 的人关注了爆炸吧知识放屁&#xff0c;是公共场合里的社交忌讳。在人头济济的电梯和地铁车厢里&#xff0c;一个呼之欲出的屁&#xff0c;对任何人来说&#xff0c;都是一场心理与生理之间的拉锯战。如果选择放屁&#xff0c;虽然疏通了肠道&#xff0c;但却拉…

Rust 能否替代 C 语言,主宰 Linux 的世界?

最近看到一个程序员工资排行的图&#xff0c;435501份数据&#xff0c;调查显示&#xff1a;Rust 是最赚钱的&#xff01;随着 Rust 的发展和表现出的优点&#xff0c;它吸引了越来越多的程序员关注。首先&#xff0c;Rust 没有历史包袱&#xff0c;集表达力、高性能、内存安全…

linux jdk环境变量配置

2019独角兽企业重金招聘Python工程师标准>>> 1.官网下载jdk tar包2.移动安装包到/usr/local 目录下,tar zxvf命令进行解压 感觉jdk的名字太难记就改成java了&#xff1a;mv (jdk~~~) java 3.设置环境变量如果是针对单个用户的环境变量控制&#xff0c;可修改~/.bas…