第一部分 深入浅出XAML
WPF是什么?
WPF是Windows Presentation Foundation的简称,是用来专门编写程序表示层的技术
1.XAML概览
1.1XAML是什么
XAML(Extensible Application Markup Language):可扩展应用程序标记语言,类似于HTML+CSS+JavaScript的组合
XAML是WPF技术中专门用来设计UI的语言
XAML是一种由XML派生而来的语言,所以很多XML中的概念在XAML是通用的
XAML是一种"声明"式语言,当看到一个标签,就意味着声明了一个对象,对象之间的层级关系要么是并列、要么是包含,全都体现在标签的关系上
2.从零起步认识XAML
2.2剖析最简单的XAML
xmlns是XML-Namespace的缩写,定义名称空间的好处是,当来源不同的类同名时,可以使用名称空间加以区分。XML特征的语法格式:xmlns[:可选的映射前缀]="名称空间"
x:Class这个Attribute的作用是当XAML解析器将包含它的标签解析成C#类后,这个类的类名是什么
3.系统学习XAML语法
3.1 XAML文档的树形结构
在XAML中,每个标签对应.NET Framework类库中的一个控件类
XAML使用树形逻辑结构来描述UI
3.2 XAML中为对象属性赋值的语法
因为XAML语言不能编写程序的运行逻辑,所以一份XAML文档中除了使用标签声明对象就是初始化对象的属性
XAML中为对象属性赋值共有两种语法:
- 使用字符串进行简单赋值
- 使用属性元素进行复杂赋值
3.3 事件处理器与代码后置
将逻辑代码与UI代码分离、隐藏在UI代码后面的形式就叫做"代码后置"
3.4 导入程序集合引用其中的名称空间
语法:xmlns:映射名="clr-namespace:类库中名称空间的名字;assembly=类库文件名"
4.x名称空间详解
x名称空间里的成员是专门写给XAML编译器看、用来引导XAML编译器把XAML代码编译成CLR代码的
x名称空间中包含的类均与解析XAML语言相关
与C#语言一样,XAML也有自己的编译器。XAML语言会被解析并编译,最终形成微软中间语言存储程序集中。
x名称空间中包含的工具:
4.2 x名称空间中的Attribute
在使用XAML编程的时候,如果你想给它加上一些特殊的标记从而影响XAML编译器对它的解析,这时候就需要额外为它添加一些Attribute。
4.2.1 x:Class
这个Attribute的作用是告诉XAML编译器将XAML标签的编译结果与后台代码中指定的类合并。在使用x:Class时必须遵守以下要求:
- 这个Attribute只能用于根节点
- 使用x:Class的根节点的类型要与x:Class的值所指示的类型保持一致
- x:Class的值所指示的类型在声明时必须使用partial关键字
4.2.2 x:ClassModifier
这个Attribute的作用是告诉XAML编译由标签编译生成的类具有怎样的访问控制级别
使用这个Attribute时需要注意:
- 标签必须具有x:Class Attribute
- x:ClassModifier的值必须与x:Class所指示的访问控制级别一致
4.2.3 x:Name
XAML是一种声明式语言,那么XAML标签声明的是什么呢?
XAML的标签声明的是对象,一个XAML标签对应着一个对象,这个对象一般是一个空间类的实例
x:Name的作用:
- 告诉XAML编译器,当一个标签带有x:Name时除了为这个标签生成对应实例外还要为这个实例声明一个引用变量,变量名就是x:Name的值
- 将XAML标签所对应对象的Name属性(如果有)也设为x:Name的值,并把这个值注册到UI树上,以方便查找
另外注意:如果标签本身有Name的属性(继承自FrameworkElement类),那么该属性和x:Name的作用是一样的,但是一个标签中只能同时用一个,为了代码可读性,后面统一使用x:Name
4.2.4 x:FiledModifier
XAML标签中的使用x:Name产生的实例的访问权限默认是Internal
x:FiledModifier是用来在XAML里改变引用变量访问级别的
4.2.5 x:Key
在WPF中,几乎每个元素都有自己的Resources属性,这个属性是个"Key-Value"式的集合,只要把元素放进这个集合,这个元素就成为资源字典中的一个条目,x:Key的作用就是为资源贴上用于检索的索引
4.2.6 x:Shared
x:Shared一定要与x:Key配合使用,如果
- x:Shared=true,每次检索的对象都是同一个对象(默认是true)
- x:Shared=false,每次检索对象时,得到的是这个对象的新副本
4.3 x名称空间中的标记扩展
4.3.1 x:Type
当我们在XAML中想表达某个数据类型时就需要使用x:Type标记扩展
例子:
①自定义Button:
②创建一个MyWindow1页面:
②创建一个MyWindow2页面,使用x:Type指定数据类型为MyWindow1:
4.3.2 x:Null
当一个属性具有默认值而我们又不需要这个默认值时,就需要显式地设置null值
例子:
为所有Button设置同样的样式,但是又想让个别Button不具有这个样式时,可以使用x:Null将默认样式设置为null
4.3.4 x:Array
x:Array的作用就是向它的Items属性向使用者暴露一个类型已知的ArrayList实例,ArrayList内成员的类型是通过x:Array的Type指明
4.3.5 x:Static
在XAML文档中使用数据类型的static成员
例子:
①定义一个静态字段和一个静态字段在处理逻辑的partial类中:
②在XAML中获取静态数据:
4.4 XAML指令元素
XAML一共有两个指定元素:
- x:Code
- x:XData
x:Code:可以在此标签中包含一些放置在后置代码中的C#代码,这样做的好处是不用把XAML代码和C#代码分置在两个文件中,但若不是遇到某些极端环境尽量不要这样做,因为这样做产生的问题是代码不好维护且不易调试
例子:
①在XAML中使用x:Code编写逻辑代码:
②之后通过XAML编译器将XAML解析成C#代码之后可以看到这块代码:
x:XData:
在x:XData元素内的元素XAML不会将其中的XML元素视为XAML命名空间或任何其他XAML命名空间的一部分,x:XData可以包含任意格式良好的XML
例子:
①定义数据源:
②使用数据源:
5.控件与布局
5.1 控件到底是什么
WPF之所以能够称得上是新一代关键在于两点:
- 之前几代GUI方法论只能使用编程语言进行UI设计,而WPF具有专门用于UI设计的XAML
- 前几代UI与数据的交互方面是由Windows消息到控件事件一脉相承,始终是把UI控件放在主导地位而把数据放在别动地位,用UI来驱动数据的改变,WPF在事件驱动的基础上引入了数据驱动界面的理念,让数据重归核心地位让UI回归数据表达者的位置
控件定义:能够展示数据、响应用户的操作
在WPF中谈控件,我们关注的应该是抽象的数据和行为而不是控件具体的形象
控件的派生关系:
FrameworkElement类在UIElement类的基础上添加了很多专门用于WPF开发的API,所以从这个类开始才算是进入WPF开发框架
5.2 WPF的内容模型
WPF UI元素分为如下类型:
对于内容控件,XAML标签的内容区域专门映射了控件的内容属性
①Button(Content):
②StackPanel(Children):
③ListBox(Items):
5.3 各类内容模型详解
族:符合某类内容模型的UI元素
每个族用它们共同基类来命名
5.3.1 ContentControl族
特点:
- 均派生自ContentControl类
- 它们都是控件
- 内容属性的名称为Content
- 只能由单一元素充当其内容(如Button,内容不能同时包含文本和图片)
ContentControl族包含的控件:
5.3.2 HeaderedContentControl族
特点:
- 它们都派生自HeaderedContentControl类,HeaderedContentControl是ContentControl类的派生类
- 它们都是控件,用于显示带标题的数据
- 除了用于显示主体内容的区域外,控件还具有一个显示标题的区域
- 内容属性为Content和Header
- 无论是Content还是Header都只能容纳一个元素作为其内容
HeaderedContentControl族包含的控件: