介绍

上一篇介绍了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的加载和控制的更多相关文章

  1. Mybatis源码解读-SpringBoot中配置加载和Mapper的生成

    本文mybatis-spring-boot探讨在springboot工程中mybatis相关对象的注册与加载. 建议先了解mybatis在spring中的使用和springboot自动装载机制,再看此 ...

  2. Prism 源码解读3-Modules加载

    介绍 在软件开发过程中,总想组件式的开发方式,各个组件之间最好互不影响,独立测试.Prism的Modules很好的满足了这一点. 这个架构图很好了讲解了Prism的Modules的概念 Prism支持 ...

  3. wemall app商城源码Android之ListView异步加载网络图片(优化缓存机制)

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之L ...

  4. 【Spring源码分析】非懒加载的单例Bean初始化过程(下篇)

    doCreateBean方法 上文[Spring源码分析]非懒加载的单例Bean初始化过程(上篇),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下 ...

  5. 【Spring源码分析】非懒加载的单例Bean初始化前后的一些操作

    前言 之前两篇文章[Spring源码分析]非懒加载的单例Bean初始化过程(上篇)和[Spring源码分析]非懒加载的单例Bean初始化过程(下篇)比较详细地分析了非懒加载的单例Bean的初始化过程, ...

  6. Spring源码分析:非懒加载的单例Bean初始化前后的一些操作

    之前两篇文章Spring源码分析:非懒加载的单例Bean初始化过程(上)和Spring源码分析:非懒加载的单例Bean初始化过程(下)比较详细地分析了非懒加载的单例Bean的初始化过程,整个流程始于A ...

  7. Spring源码分析:非懒加载的单例Bean初始化过程(下)

    上文Spring源码分析:非懒加载的单例Bean初始化过程(上),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下AbstractAutowireC ...

  8. Prism 源码解读1-Bootstrapper和Region的创建

    介绍 之前也研究过Prism框架但是一直没有深入理解,现在项目上想把一个Winform的桌面应用程序改造成WPF程序,同时我希望程序是可测试可维护架构良好的,Prism的这些设计理念正好符合我的需求, ...

  9. Prism 源码解读5-数据绑定和命令

    介绍 WPF本身就支持通知.绑定和命令,实现ViewModel和VIew之间的通讯,但相对来说功能比较少,Prism扩充了这些功能并提供更加强有力,简洁的数据绑定和命令. 0 绑定通知 WPF的绑定通 ...

随机推荐

  1. 11. 无数人难办事? - 迪米特法则(LoD)

    11.1 第一天上班 时间: 4月2日19点   地点: 小菜大鸟住所的客厅   任务: 小菜, 大鸟      "回来啦! 怎么样? 第一天上班感受多吧." 大鸟关关心的问道.  ...

  2. PyGame学习笔记之壹

    新建窗口 代码 '''PyGame学习笔记之壹''' import pygame # 引入 PyGame 库 pygame.init() # PyGame 库初始化 screen = pygame.d ...

  3. git还原历史某一版本

    返回上一版本 git reset --hard HEAD^ 常用的命令git refloggit reset --hard "填写版本号" 黄色的就是版本号 其他查看以前版本的命令 ...

  4. Matplotlib数据可视化(3):文本与轴

      在一幅图表中,文本.坐标轴和图像的是信息传递的核心,对着三者的设置是作图这最为关心的内容,在上一篇博客中虽然列举了一些设置方法,但没有进行深入介绍,本文以围绕如何对文本和坐标轴进行设置展开(对图像 ...

  5. Vue-API之全局配置

    API 全局配置 Vue.config 是一个对象,包含 Vue 的全局配置. 源码位置:util/config.js 搜索config 可以找到其源码地址,其中声明了config的类型和默认参数 下 ...

  6. 虚拟机+server03系统+sql的安装

    教程: 首先安装虚拟机 然后安装server系统 最后完成sql的安装 https://download.pchome.net/system/sysenhance/detail-4673.html 虚 ...

  7. mysql 常用获取时间sql语句

    --当年第一天: SELECT DATE_SUB(CURDATE(),INTERVAL dayofyear(now())-1 DAY); --当年最后一天: SELECT concat(YEAR(no ...

  8. 日常破解--从XCTF的app3题目简单了解安卓备份文件以及sqliteCipher加密数据库

    一.题目来源     题目来源:XCTF app3题目 二.解题过程     1.下载好题目,下载完后发现是.ab后缀名的文件,如下图所示:     2.什么是.ab文件?.ab后缀名的文件是Andr ...

  9. 2019年高校微信小程序开发大赛学习笔记

    学做小程序(学堂在线笔记)一.传统布局 text-align:center //水平居中 margin-bottom: 60px //设置间距 二.弹性盒子布局 display:flex; flex- ...

  10. 爬虫之BeautifulSoup类

    安装:pip install BeautifulSoup4 下表列出了主要的解析器,以及它们的优缺点:看个人习惯选取自己喜欢的解析方式 # 获取html代码 import requests r = r ...