开始
xaml 用于编写 WPF 的 UI,其中每一个元素都是一个类的实例对象,标签内的属性赋值就是对该对象的属性进行赋值
xaml 支持多种形式的属性设置,主要有以下三种方式
-
键值对赋值
1
<Button Content="Hello"/>
-
属性标签:每个标签看做一个对象,可嵌套它的属性标签设置属性,适用于复杂对象属性赋值
1
2
3
4
5<Button>
<Button.Content>
<TextBlock Text="Hello"/>
</Button.Content>
</Button> -
标签扩展:在
attr=value
形式上,使用{}
包裹 value 部分,在其中构造中介对象,通过中介对象赋予属性值,类名后跟的键值对是对中介对象的属性赋值,只有MarkupExtension
类的子类才支持标签扩展1
2<!--在{}中构造对象,如构造Binding对象使用绑定,构造StaticResource使用静态资源等-->
<TextBlock Text="{Binding ElementName=obj, Path=Value, Mode=OneWay}"/>实际上,使用标签扩展是调用了类的构造器,因此可不指定属性名,按顺序赋值
1
2<!--将Path赋值为Value-->
<TextBlock Text="{Binding Value}"/>
X 命名空间
X 命名空间中包含解析 xaml 文件的内容,通常使用其中的元素和属性来标记 xaml 标签
-
x:Class
:指定编译生成的界面类合并到哪个后台类,只能用于根标签 -
x:ClassModifier
:指定 xaml 界面类的访问级别,应与后台类的访问级别相同 -
x:Name
xaml 中每个元素都是一个实例对象,
x:Name
为 xaml 元素实例生成引用(类似创建 id),若元素自带 Name 属性,则同时将x:Name
赋值给 Name 属性若元素有 Name 属性,则设置 Name 属性也能引用到元素实例,但有些元素没有 Name 属性,此时只能使用
x:Name
,为了统一,推荐仅使用x:Name
引用元素 -
x:FieldModifier
:设置元素实例的访问级别,作为元素的属性使用 -
x:Key
:用于标识资源字典中的资源,在 C#中使用FindResource
方法获取 -
x:Shared
:与x:Key
配合使用,值为 true 时,获取到的资源是同一个对象,否则是该资源的副本 -
x:Type
:标签扩展,用于访问Type
类型对象,传入TypeName
属性 -
x:Null
:标签扩展,用于将对象的某个属性设为 null -
x:Array
:标签扩展,可以构造一个数组,Type
属性指定数组元素的类型 -
x:Static
:标签扩展,用于访问类的静态成员,传入类的静态成员
事件处理器
标签对象中有些属性接收一个处理函数,这种函数称为事件处理器,实现一个事件处理主要定义三个要素
- 指定事件
- 实现事件处理器
- 建立订阅
以 Button 点击为例
-
指定事件
1
2<!--在x命名空间的Name属性指定控件的id,准备为MyButton的Click事件赋值-->
<Button x:Name="MyButton" Click=""/> -
实现事件处理器
1
2
3
4
5
6
7
8
9
10namespace App {
public partial class MainWindow : Window {
// ...
// 实现事件处理器
private void MyButton_Click(object sender, RoutedEventArgs e) {
// statements;
}
}
} -
建立订阅:有两种方式,通过 xaml 设置或者通过 C#代码设置
-
通过 xaml 设置
1
<Button x:Name="MyButton" Click="MyButton_Click"/>
-
通过 C#代码设置
1
2// Click是一个委托,将Click的功能委托到MyButton_Click
this.MyButton.Click += new RoutedEventHandler(MyButton_Click);
-
引用类库
将类库引入到 xaml 的语法如下
1 | xmlns:{自定义名称}="clr-namespace:{类库命名空间}";assembly={类库文件名}" |
使用命名空间中的类
1 | <自定义名称:类><自定义名称:类/> |