WPF学习目录
XAML中的属性和事件
1. XAML中的属性
1.1 简单属性与类型转换器
XAML解析器需要执行比表面上看起来更多的工作。XML特性中的值总是纯文本字符串。但对象的属性可以是任何.NET类型。
-
HorizontalAlignment
和VerticalAlignment
使用的是枚举类型(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,就需要用到这种语法,
如下:
<Grid>
<Grid.Background>
<ImageBrush ImageSource="xx.jpg"/>
</Grid.Background>
</Grid>
目前我们先不用管这些代码实现了什么功能,只需要了解属性元素语法这种语法格式就可以了。
property-element syntax最核心的就是这个 (.)符号,它把属性和嵌套内容区分开来。
2. XAML中的事件
在XAML中,为控件关联事件处理程序比较简单。语法格式为:事件名=“事件处理程序方法名”
如Button的Click事件,在XAML中:
<Button Content="OK" Click="Button_Click"/>
在后台代码中可以看到系统生成的事件处理程序
private void onclick(object sender, RoutedEventArgs e){}
说明:
- 在Visual Studio 2019中,键入 事件名=后,Visual Studio 2019提示生成默认的事件处理程序,这个时候我们点击回车,就可以生成相关代码
- 如果需要修改事件处理程序方法名,可以在手动输入方法名后,按F12,系统会帮我们生成相关代码。
特殊符号:
< <
> >
& &
' '
" "