1. UI布局关键概念

一个组合应用UI的根节点被称作Shell,一般只有一个Shell。Shell作为应用的主页,包含一个或者多个域。域是内容占位符,可以包含一个或者多个View。有很多控件可以作为域,如ContentControl,ItemsControl,TabControl,以及一些自定义的容器控件。

1.1. Shell

作为应用根节点,Shell是Window对象,虽然Shell是window对象,但是Shell也可以定义相应的view model对象。Shell定义整体布局,一些通用UI元素,如背景,主菜单,工具栏等。Shell定义程序外观,如样式,模板,边框等等,总之,Shell是应用的全局管理者。

1.2. Views

Views 是UI的主要单元,你可以将一个User Control,Page,Data template,自定义控件作为一个View。一个控件可以是一个功能非常独立的部件,也可以是一个复用性很高的部件。

1.3. 组合View

组合view包含一个父view和一个,或者多个子view,继续拆分原因未知?

1.4. Region

Prism通过Region Manager,Region,以及Region Adapter来管理域。

RegionManager

RegionManager负责创建和维护域集合,RegionManager使用“控件指定”适配器来将新域与主控件关联。

graph TB
A(RegionManager)
B(ItemsControlRegionAdapter)
C(Region)
D(ItemsControl)
A--find adapter for control-->B
B--Associate region-->D
B--Create region-->C
D-->C

附加属性RegionManager.RegionName将一个主控件变为一个的域,RegionManager提供RegionContext属性帮助不同Region间共享数据。

Region实现

Region是一个实现接口IRegion的类。Region能够包含任何类型的UI内容,一个Region可以包含一项或者多项内容,这取决于使用什么控件作为Region。例如一个ContentControl类型Region只能显示一个对象,一个ItemsControl类型Region则能显示多项。

1.5. 默认域功能

一个普通的Control转换为一个具有丰富功能的域需要解决诸如如何找到和实例化View,如何通知激活的view以及如何管理view的生命周期等这些问题。这依赖于两种类,Region Adapter以及Region behaviors。

1.5.1 Region Adapter

为了将UIControl变成一个region,需要有一个域适配器。域适配器负责创建域并与相应宿主控件关联。依据不同类型的主控件,Prism提供如下适配器:

  • ContentControlRegionAdapter,对应ContentControl
  • SelectorRegionAdapter,对应TabControl
  • ItemsControlRegionAdapter,对应ItemsControl
1.5.2 Region Behavior

所谓region behavior是指为Region提供附加功能的类,这些类是拔插式部件,使用这些类可以实现view发现,支持Region Context以及扩展域实现。

Registration Behavior

RegionManagerRegistrationBehavior负责保证Region注册在合适的RegionManager中,当一个代表Region的控件注册为另一个控件的孩子时,当前Region也需要注册到父控件的RegionManager中

Auto-Population Behavior

自动填入行为,标准类名是AutoPopulateRegionBehavior,当该行为附加在Region时,它会获取所有在该Region名下的View类型,然后创建这些view的实例并将他们添加到Region中,当域创建完成后, AutoPopulateRegionBehavior会监听RegionViewRegistry,获取绑定在该域名下的view。

Region Context Behaviors

这个域行为包含两个子行为,SyncRegionContextWithHostBehavior,BindRegionContextToDependencyObjectBehavior。顾名思义,前者将域内容同步到view,后者将域内容绑定到依赖属性。

Activation Behavior

类RegionActiveAwareBehavior负责设定一个view是否处于激活状态,这种设定是单向的,view不能通过改变自己的激活状态实现目标。view需要实现接口IActiveAware获取自己状态。

Region Lifetime Behavior

该行为用于判定是否需要将无效的view移除,判定一个view是否需要移除首先view需要实现接口IRegionMemberLifetime,依次检测如下值:

  1. IRegionMemberLifetime.KeepAlive 值
  2. DataContext's IRegionMemberLifetime.KeepAlive
  3. RegionMemberLifetimeAttribute.KeepAlive
  4. DataContext's RegionMemberLifetimeAttribute.KeepAlive
Control-Specific Behaviors

这个行为主要是用于同步selector与激活view信息,该行为仅适用于继承至Selector控件。

1.6. View Composition

在组合应用中,构造多个view你需要决定将views放在哪个位置,什么被创建以及什么位置显示。通过view 发现以及view 注入策略,我们可以实现view的创建以及显示。

1.6.1. View发现

在view发现机制中,通过RegionViewRegistry在Region名以及view类型间建立联系。当一个region创建后,会自动创建,导入需要的view。

1.6.2. View注入

在该种机制中,你获取一个region的引用,然后调用Add方法添加需要的view。可以先利用相应的RegionManager传入需要的名称,找到该view,然后执行后面操作。

1.6.3. Navigation

Prism库包含导航API,通过该API,可以实现实例化view,添加操作,并允许返回先前的view。

1.6.4. 该使用哪种?

以上两种view导入策略各具优势,适用不同场景,view 发现使用场景:

  • 需要自动导入
  • 一个view只有一个唯一实例被导入

view 注入适用如下场景:

  • 你的应用使用导航API
  • 你需要显示控制view的创建,显示,删除
  • 在同一个域中,你需要显示同一个view的不同实例(包含不同数据)
  • 需要控制view加入哪个Region

2. UI布局场景

2.1 实现Shell

一个应用可以有超过一个Shell,如果你的应用具有两个顶级窗口,则可以使用两个Shell

2.2 使用代码添加Region

如下,ActionContent是一个ListBox类型的容器,

//获取域管理
IRegionManager regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();
//设定域管理
RegionManager.SetRegionManager(this.ActionContent, regionManager);
//添加域
RegionManager.SetRegionName(this.ActionContent, "ActionRegion");

2.3. Region导入时添加view

view发现策略下Prism可以实现自动实例化view并自动导入view,前提是需要将view与相应的域关联起来,如下:

this.regionManager.RegisterViewWithRegion("MainRegion", typeof(EmployeeView));

2.4. 通过程序在Region中显示View

这个适用view注入策略,代码如下:

// View injection
IRegion region = regionManager.Regions["MainRegion"];
var ordersView = container.Resolve<OrdersView>();
region.Add(ordersView, "OrdersView");
region.Activate(ordersView);

2.5. 在域中排列view

当一个域中包含多个view时,我们可能需要对这些view进行排列,默认情况下views按照在Region注册和添加的方式排列。为了允许View自定义view序列,Prism提供ViewSortHint标记,这个标记包含Hint属性,允许view声明它应该在region中如何排列,按照字符串大小顺序排列。

7. 组合你的UI的更多相关文章

  1. 业务接口+UI层的设计(基于Castle实现的Repository)

    业务接口+UI层的设计(基于Castle实现的Repository) Repository层设计的文章见:[http://www.cnblogs.com/yomho/p/3297042.html]   ...

  2. 【Yom框架】漫谈个人框架的设计之三:业务接口+UI层的设计(基于Castle实现的Repository)

    Repository层设计的文章见:[http://www.cnblogs.com/yomho/p/3297042.html]   一.概要设计 上面Reposity 应该为 Repository 特 ...

  3. FairyGUI编辑器制作Unity3D UI值得借鉴

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...

  4. Xamarin.Forms 简介

    An Introduction to Xamarin.Forms 来源:http://developer.xamarin.com/guides/cross-platform/xamarin-forms ...

  5. [转]Ionic系列——CodePen上的优秀Ionic_Demo

    本文转自:http://my.oschina.net/u/1416844/blog/514361?fromerr=bbFC5JIl 案例网站 Slidebox with Dynamic Slides ...

  6. 自定义View(一)-ViewGroup实现优酷菜单

    自定义View的第一个学习案例 ViewGroup是自动以View中比较常用也比较简单的一种方式,通过组合现有的UI控件,绘制出一个全新的View 效果如下: 主类实现如下: package com. ...

  7. Unity NGUI和UGUI与模型、特效的层级关系

    目录 1.介绍两大UI插件NGUI和UGUI 2.unity渲染顺序控制方式 3.NGUI的控制 4.UGUI的控制 5.模型深度的控制 6.粒子特效深度控制 7.NGUI与模型和粒子特效穿插层级管理 ...

  8. 《Programming WPF》翻译 第7章 1.图形基础

    原文:<Programming WPF>翻译 第7章 1.图形基础 WPF使得在你的应用程序中使用图形很容易,以及更容易开发你的显卡的能力.这有很多图形构架的方面来达到这个目标.其中最重要 ...

  9. 【转】http://www.cnblogs.com/yuzukwok/p/3884377.html

    来自:http://www.cnblogs.com/yuzukwok/p/3884377.html An Introduction to Xamarin.Forms 来源:http://develop ...

随机推荐

  1. Go 接口类型

    接口作用 Go语言中的接口是一种类型,类似于Python中的抽象基类. Go语言中使用接口来体现多态,是duck-type的一种体现. 如,只要一个东西会叫,会走,那么我们就可以将它定义为一个动物的接 ...

  2. rm -rf /*真的能删掉所有文件吗?

    大佬们对于小白问的问题经常直接就是一个rm -rf /*丢过去(逃,被丢了很多次,所以印象深刻),但玩了这么久的梗,当我真正想删库的时候,这条命令却然并卵(滑稽,删库跑路都跑不成). 查看了下文件属性 ...

  3. ansible-任务控制tags

    1. ansible-任务控制tags介绍        如果你有一个大型的剧本,那么只能运行它的特定部分而不是在剧本中运行所有内容可能会很有用.因此,Ansible支持"tags:&quo ...

  4. python进程开启的两种方式

    一.进程 1.1.方式一 from multiprocessing import Process import time #方式一 def task(name): print(f"my na ...

  5. redis哨兵搭建

    redis哨兵搭建 1.复制配置文件到conf #单机安装以后[root@t3 redis-5.0.8]# pwd/app/redis-5.0.8[root@t3 redis-5.0.8]# cp s ...

  6. 学习go语言并完成第一个作品

    之前有使用C#写一个Windows下的发送邮件的命令行工具,方便一些脚本出现异常时向我的邮箱发送邮件提醒.但这并没有被我频繁使用,因为我的有些脚本还是在linux下面运行,因此我又有一篇文章用linu ...

  7. web自动化测试总结

    web自动化: 1.测试用例(操作步骤,熟读需求文档,web项目先用手工研究,前置条件,预期结果) 接口自动化测试中数据功能最适合作为数据驱动,数据放在excel中需要操作excel 为什么web自动 ...

  8. 灵魂拷问:你真的理解System.out.println()执行原理吗?

    原创/朱季谦 灵魂拷问,这位独秀同学,你会这道题吗?  请说说,"System.out.println()"原理...... 这应该是刚开始学习Java时用到最多一段代码,迄今为止 ...

  9. linux(centos8):安装kubernetes worker节点并加入到kubernetes集群(kubernetes 1.18.3)

    一,安装kubernetes前的准备工作      安装前的准备工作(master\worker都要进行)      参见: https://www.cnblogs.com/architectfore ...

  10. logstash -grok插件语法介绍

      介绍 logstash拥有丰富的filter插件,它们扩展了进入过滤器的原始数据,进行复杂的逻辑处理,甚至可以无中生有的添加新的 logstash 事件到后续的流程中去!Grok 是 Logsta ...