文章

WPF基础——XAML语言

开始

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
<自定义名称:类><自定义名称:类/>
本文由作者按照 CC BY 4.0 进行授权