5. XAML中的属性和事件


XAML中的属性和事件

1. XAML中的属性

1.1 简单属性与类型转换器

XAML解析器需要执行比表面上看起来更多的工作。XML特性中的值总是纯文本字符串。但对象的属性可以是任何.NET类型。

  • HorizontalAlignmentVerticalAlignment使用的是枚举类型(System.Windows.Horizontalalignment 和 System.Windows.VerticalAlignment)
  • FontFamily使用的是字符串类型
  • FontSize使用的是整型
  • ForeGround使用的是Brush类型

为了关联字符串值和非字符串属性,XAML解析器需要执行转换。由类型转换器执行转换,类型转换器是从 NETl.O 起就已经引入的 .NET 基础结构的一个基本组成部分。

实际上,类型转换器在这个过程中扮演着重要角色 提供了实用的方法,这些方法可将特定的.NET数据类型转换为任何其他.NET类型,或将其他任何 .NET类型转换为特定的数据类型, 比如这种情况下的字符串类型。

XAML解析器通过以下两个步骤来查找类型转换器:

(l)检查属性声明,查找TypeConverter特性(如果提供了TypeConverter特性, 该特性将指定哪个类可执行转换)。
例如, 当使用诸如Foreground这样的属性时,.NET将检查 Foreground 属性的声明。

(2)如果在属性声明中没有TypeConverter特性,XAML解析器将检查对应数据类型的类声明。
例如:Foreground属性使用一个Brush对象。由于Brush类使用TypeConverter(typeof(BrushConverter))特性声明进行了修饰, 因此Brush类及其子类使用BrushConverter类型转换器。

查找System.Windows.Media.Brush源码,可以看到,Brush类使用了TypeConverter(typeof(BrushConverter))进行修饰,所以Brush及其子类都会使用BrushConverter类进行转换

[Localizability(LocalizationCategory.None, Readability=Readability.Unreadable), ValueSerializer(typeof(BrushValueSerializer)), TypeConverter(typeof(BrushConverter))]
public abstract class Brush : Animatable, IFormattable, DUCE.IResource
{
    ......
}

如果属性声明或类声明都没有与其关联的类型转换器,XAML解析器就会报错。

说明:

XAML元素是case sensitive(大小写敏感),而元素的属性不是case sensitive

2. 复杂属性

有了类型转器的理论基础后,又遇到了一个新的问题。那就是如果属性需要的对象自己还拥有一组属性,这种情况应该怎么办?

XAML提供了property-element syntax(属性元素语法)。使用属性元素语法,可添加名称形式为Parent.PropertyName的子元素。例如,Grid控件有一个Background属性,该属性允许提供用于绘制控件背景区域的画刷。如果希望使用更复杂的画刷----比单一固定颜色填充更高级的画刷--就需要添加名为Grid.Background的子标签

例如:Grid控件有一个Background属性,如果我们想使用更复杂的Brush,就需要用到这种语法,

如下:


    
        
    

目前我们先不用管这些代码实现了什么功能,只需要了解属性元素语法这种语法格式就可以了。

property-element syntax最核心的就是这个 (.)符号,它把属性和嵌套内容区分开来。

2. XAML中的事件

在XAML中,为控件关联事件处理程序比较简单。语法格式为:事件名=“事件处理程序方法名”
如Button的Click事件,在XAML中:

在后台代码中可以看到系统生成的事件处理程序

private void onclick(object sender, RoutedEventArgs e){}

说明:

  1. 在Visual Studio 2019中,键入 事件名=后,Visual Studio 2019提示生成默认的事件处理程序,这个时候我们点击回车,就可以生成相关代码
  2. 如果需要修改事件处理程序方法名,可以在手动输入方法名后,按F12,系统会帮我们生成相关代码。

特殊符号:

<  <
>  >
&  &
'  '
" "