Prism 源码解读2-View的加载和控制
介绍
上一篇介绍了Region,这一篇跟Region息息相关,讲一下Region中View的加载方式及控制。
4、ViewDiscovery
在创建好Region后需要将View添加到Region中。先补充几个概念
在上一篇将了如何创建Region,现在让我们看看Region类是什么

- private ViewsCollection views;
- private ViewsCollection activeViews;

这是一个View集合,集合改变会触发CollectionChanged事件

其完全依赖ObservableCollection对象

- this.Behaviors = (IRegionBehaviorCollection) new RegionBehaviorCollection((IRegion) this);

这是一个行为集合,每当添加进行为的时候,会主动调用Attach()

- PropertyChanged事件,每当Context,Name, RegionManager,会触发该事件
下面来看一个好玩的行为AutoPopulateRegionBehavior

可以看到这个行为对RegionViewRegistry有依赖,这个是通过构造注入的方式注入的。

该RegionViewRegistry保存着所有的View,是名副其实的Registry.

该Registry有一个事件ContentRegistered,

每当调用这个方法的时候就会触发这个事件。
不能跑偏了,回到AutoPopulateRegionBehavior

在行为Attach的时候,已经对RegionViewRegistry进行了订阅。


看看this.Region.Add()



这个ItemMetadataCollection的改变会影响Views和ActiveViews

首先它是一个ObservableCollection,


其次ViewCollection就是依赖ItemMetadataCollection创建的,所以改变自然会影响ViewCollection
那这个VIewCollection是怎么来影响界面的呢,这就要看看另一个行为RegionActiveAwareBehavior





至此可能会一头雾水,这讲了什么啊,一会是Region,一会是Behavior,到底想说什么啊?其实就是讲了View是如何被自动注入到对应的Region。
下面让我们跟着Samples中的ViewDiscovery并结合刚刚讲的源码梳理一下。
- 在程序开始的时候向行为工厂中注入了相应的行为

- 在创建Region的时候RegionAdapter向其添加了所有的行为

- 现在只需调用RegionManager.RegisterViewWithRegion方法就可以自动向Region中添加VIew并显现出来


可以看到就是调用RegionViewRegistry中Register'VIew'With'Region方法
- 下面就等着AutoPopulateRegionBehavior和RegionActiveAwareBehavior按照上面的方式工作就可以了。
可以看出为什么Region有这么强大的功能就是因为Prism给Region提供了很多的行为,行为作为WPF的一个特性,其作用是非常强大的。后面的View生命周期管理也是通过行为来完成的
5、ViewInjection
View手动加载到Region,通过一个点击事件,通过RegionManager的Regions属性添加View

这个就更简单了,因为没有走RegionVIewRegistry,而是直接通过Region添加View,会直接添加到对应的RegionView上,然后通过RegionActiveAwareBehavior显示,上面有就不再详尽叙述了。
6、ViewActivationDeactivation
激活或停用View
这个也不多BB直接看怎么调用

首先先用手动的方式向Region中添加两个View

就是两个方法Activate和Deactivate

这实现也太巧妙了吧,通过ItemMetadata直接影响了View和ActiveView,然后通过RegionActiveAwareBehavior行为实现。真帅

就不再叙述了。
总结
本章主要讲了View的加载方式,可以手动加载,可以自动加载,并可以控制View的Activate和DeActivate。其主要实现都是依靠行为,也从侧面反映出行为的强大,行为能做的事情实在太多了。下一章会对Modules的实现进行介绍。
Prism 源码解读2-View的加载和控制的更多相关文章
- Mybatis源码解读-SpringBoot中配置加载和Mapper的生成
本文mybatis-spring-boot探讨在springboot工程中mybatis相关对象的注册与加载. 建议先了解mybatis在spring中的使用和springboot自动装载机制,再看此 ...
- Prism 源码解读3-Modules加载
介绍 在软件开发过程中,总想组件式的开发方式,各个组件之间最好互不影响,独立测试.Prism的Modules很好的满足了这一点. 这个架构图很好了讲解了Prism的Modules的概念 Prism支持 ...
- wemall app商城源码Android之ListView异步加载网络图片(优化缓存机制)
wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之L ...
- 【Spring源码分析】非懒加载的单例Bean初始化过程(下篇)
doCreateBean方法 上文[Spring源码分析]非懒加载的单例Bean初始化过程(上篇),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下 ...
- 【Spring源码分析】非懒加载的单例Bean初始化前后的一些操作
前言 之前两篇文章[Spring源码分析]非懒加载的单例Bean初始化过程(上篇)和[Spring源码分析]非懒加载的单例Bean初始化过程(下篇)比较详细地分析了非懒加载的单例Bean的初始化过程, ...
- Spring源码分析:非懒加载的单例Bean初始化前后的一些操作
之前两篇文章Spring源码分析:非懒加载的单例Bean初始化过程(上)和Spring源码分析:非懒加载的单例Bean初始化过程(下)比较详细地分析了非懒加载的单例Bean的初始化过程,整个流程始于A ...
- Spring源码分析:非懒加载的单例Bean初始化过程(下)
上文Spring源码分析:非懒加载的单例Bean初始化过程(上),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下AbstractAutowireC ...
- Prism 源码解读1-Bootstrapper和Region的创建
介绍 之前也研究过Prism框架但是一直没有深入理解,现在项目上想把一个Winform的桌面应用程序改造成WPF程序,同时我希望程序是可测试可维护架构良好的,Prism的这些设计理念正好符合我的需求, ...
- Prism 源码解读5-数据绑定和命令
介绍 WPF本身就支持通知.绑定和命令,实现ViewModel和VIew之间的通讯,但相对来说功能比较少,Prism扩充了这些功能并提供更加强有力,简洁的数据绑定和命令. 0 绑定通知 WPF的绑定通 ...
随机推荐
- Hexo和github搭建个人博客 - 朱晨
GitHub账号 mac/pc 环境 12 node.jsgit 创建GitHub仓库 登陆GitHub,创建一个新的Respository Repository name叫做{username}.g ...
- golang实现chunk方式的查询
有一个需求,是把表里面所有的数据都查询出来,并且生成json文件.因为一张表里面的数据很多,所以不可能一次性全部查询出来,所以需要用到chunk.之前用的gorm,但是发现gorm没有chunk方式的 ...
- Ubuntu19.10安装OMNeT++ (omnetpp-5.6)中遇到的问题
在官网上下载对应版本的安装包,里面有说明性的文档,先在第五章ubuntu那里配置好前期的环境,再到linux那一章,看进行安装,本文即从这里开始记录. 安装包中的文档目录为:omnetpp-5.6/d ...
- Leetcode 24题 两两交换链表中的节点(Swap Nodes in Pairs))Java语言求解
题目描述: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3->4,你应该返回 ...
- 在线选题系统完善篇(PHP)
第一篇: 选题在线提交系统(html+JS+PHP) 这是当时根据需求做的一个简单的版本,只能适用于这一个场景,而且题目等一系列数据都不能改.然后结束后,我又对重新写了一个有后台管理的选题系统.相对于 ...
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.2)- FlexSPI NOR连接方式大全(RT1060/1064(SIP))
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1060/1064(SIP)两款MCU的FlexSPI NOR启动的连接方式. 上一篇文章<FlexSPI N ...
- python之面向对象02
在python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做“魔法”方法 1. __init__()方法 class Cat: def __init__(self,newname, ...
- 前端每日实战:123# 视频演示如何用纯 CSS 创作一架双冀飞机
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/yxVYRL 可交互视频 此视频是可 ...
- Css里的BFC
一.BFC简介 BFC全称:Block Formatting Contexts (BFC,块级格式化上下文),就是 一个块级元素 的渲染显示规则 (可以把 BFC 理解为一个封闭的大箱子,,容器里面的 ...
- React Native 在 Airbnb(译文)
在Android,iOS,Web和跨平台框架的横向对比中,React Native本身是一个相对较新且快速开发移动的平台.两年后,我们可以肯定地说React Native在很多方面都是革命性的.这是移 ...