开始

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:标签扩展,用于访问类的静态成员,传入类的静态成员

事件处理器

标签对象中有些属性接收一个处理函数,这种函数称为事件处理器,实现一个事件处理主要定义三个要素

  1. 指定事件
  2. 实现事件处理器
  3. 建立订阅

以 Button 点击为例

  • 指定事件

    1
    2
    <!--在x命名空间的Name属性指定控件的id,准备为MyButton的Click事件赋值-->
    <Button x:Name="MyButton" Click=""/>
  • 实现事件处理器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    namespace 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
<自定义名称:类><自定义名称:类/>