XAML中的属性和事件

XAML中的属性和事件

迄今为止,你已经讨论了一个没啥意思的例子—有一个空栅格控件的空白页面。在继续学习之前,介绍一个包含更多元素的真实页面是有必要的。图2-1显示了一个自动回答问题的例子。

(图2-1

eight ball页面包括四个元素:一个栅格(在银光中用来安排布局的最常用的工具),两个文本框对象和一个按钮。被用来安排和配置这些元素的标记语言比上一个例子更加引人注目了。下面是一个用省略号的小型代码来说明整体结构:

<UserControl x:Class="EightBall.MainPage"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Width="400" Height="300">

<Grid x:Name="grid1">

<Grid.Background>

...

Grid.Background>

<Grid.RowDefinitions>

...

Grid.RowDefinitions>

<TextBox x:Name="txtQuestion" ... >

TextBox>

<Button x:Name="cmdAnswer" ... >

Button>

<TextBox x:Name="txtAnswer" ... >

TextBox>

Grid>

UserControl>

在下面的章节中,你将探索这个文档的内容并且学到XAML的语法。

简单的属性和类型转换

就像你看到的,一个XML元素的特性设置相对应的银光对象的属性。比如,在eight ball这个例子中文本框配置了alignment, marginfont属性:

<TextBox x:Name="txtQuestion"

VerticalAlignment="Stretch" HorizontalAlignment="Stretch"

FontFamily="Verdana" FontSize="24" Foreground="Green" ... >

为了工作起来,System.Windows.Controls.TextBox类必须提供下面的属性:VerticalAlignment, HorizontalAlignment, FontFamily, FontSizeForeground。在下面的章节中你将学到每一个属性的意思:

提示:有一些特殊的字符不能直接写入属性字符串,包括quotation 标记,&符号还有两个<>尖括号。为了用这些值,你必须用相等的XML字符来替换它们。用";替换quotation 标记, &; 替换&, <;替换< (小于) 字符, >; 替换 > (大于) 字符。当然,这些限制是XML的细节,它并不影响你在代码中设置属性。

为了让属性系统工作,XAML解释器需要处理比你想象的更多的工作。XML特性的值通常是一个简单的字符串,但是对象的属性可以是任何.NET类型。在上面的例子中,有两个属性枚举型(VerticalAlignment HorizontalAlignment),一个字符串(FontFamily),一个整形(FontSize),还有一个Brush 对象 (Foreground)

为了跨越字符串型和非字符串型的鸿沟,XAML解释器需要进行转换。这种转换是被类型转换器执行的,它是从完整的.NET框架中借用过来的基础部件。

本质上说,类型转换器在生命周期中扮演一个角色——它提供一套有用的方法,可以吧一个特定的.NET数据类型正向和反向转换到任何.NET的类型,比如在这个例子中的字符串。XAML解释器由两步来发现类型转换器:

1、              它检测属性的声明,搜索类型转换器属性。(如果有,类型转换特性命令相关类处理转换)比如,当你用属性Foreground.NET就检测Foreground属性的声明。

2、              如果在属性声明中没有类型转换器特性,XAML解释器检测相应数据类型的类的声明。比如,Foreground属性用了Brush对象。Brush类(和它的派生类)用到了Brush转换器(typeof(BrushConverter))特性的声明。

3、              如果在属性声明和类的声明中没有相关的类型转换XAML将生产错误。

这个系统是简单但很柔性的。如果在类的层次你设置了类型转换器,就可以在用这个类的时候转换所有的属性。另一方面,如果你想对特殊的属性进行调整类型转换的方式,你可以在属性声明中用类型转换器予以替换。

在代码中使用类型转换器在技术上是可行的,但是语法有些麻烦。通常最好的办法是直接设置属性——这样不仅很快,而且可以避免打字的潜在错误,而这种错误在运行前是难以扑捉的。对这个问题XAML没有反映因为XAML是在编译时才解析和验证的。

注释 XAML, 象所有基于XML的语言都是区分大小写的,这意味着你不能用

你可能感兴趣的:(XAML中的属性和事件)