本文摘自:http://technet.microsoft.com/zh-cn/magazine/ms788723.aspx
XAML 概述 (WPF)中曾介绍过的基本术语。
本主题包括下列各节。
- XAML 语言规范
- XAML 和 CLR
- 对象元素语法
- 对象元素的属性
- 特性语法(属性)
- 属性元素语法
- 集合语法
- XAML 内容属性
- 内容属性和集合语法组合
- XAML 命名空间
- 标记扩展
- 附加属性
- 附加事件
- XAML 根元素剖析
- 可选的和不建议的 XAML 用法
- 相关主题
XAML 语言规范
XAML 和 CLR
对象元素语法
最后,必须存在下列一种情况:
-
元素和标记必须用正斜杠 (/) 和紧跟的右尖括号 (>) 结尾。
-
对象元素还必须存在等效的结束标记,并与其他开始标记/结束标记对形成正确的嵌套和平衡。
在 XAML 中引用 CLR 类型时,还可以访问该类型的继承成员。
Name 特性及其值:
Text。
内容模型
在可用作 XAML 元素的控件和其他 WPF 类的类页面上,将特定元素的内容模型记录为备注的一部分。
特性值必须是用引号引起来的字符串。
|
|
|---|
|
XML 字符实体和 XAML。 |
后备类型系统中属性的值必须为值类型,或者必须为可由 XAML 处理器在访问相关后备类型时实例化或引用的引用类型。
对于 WPF XAML 事件,作为特性名称被引用的事件必须是公共事件,并且必须具有公共委托。
属性或事件必须是由包含对象元素实例化的类或结构的成员。
特性值的处理
对于属性,默认处理行为由基础 CLR 属性的类型确定。
特性值由下面的操作之一,按照如下处理顺序进行填充:
-
在许多情况下,标记扩展返回的对象是对现有对象的引用或是将计算推迟到运行时的表达式,而不是新实例化的对象。
-
TypeConverter 声明的,则该特性的字符串值将作为转换输入提交到类型转换器,然后转换器将返回新的对象实例。
-
此最终级别是在 XAML 语言基元类型之间直接转换本身具有分析器的值、或检查枚举(分析器随后将访问匹配的值)中命名常量的名称。
枚举特性值
XAML 中的枚举由 XAML 分析器进行内部处理,而枚举的成员则应该通过指定枚举的某个命名常量的字符串名称进行指定。
值 的特性,它将无法正确解析。
Trigger:
...
<Trigger Property="Visibility" Value="Collapsed,Hidden">
<Setter ... />
</Trigger>
...
此转换支持用更传统的语法表示 Microsoft Windows 编程中的组合键(如“Ctrl+Alt”)。
属性引用和事件成员名称引用
指定特性时,可以引用作为您为包含对象元素实例化的 CLR 类型的成员而存在的任何属性或事件。
(后面的某节即将讨论附加属性。)
路由事件概述。
样式设置和模板化。
PropertyPath XAML 语法。
x:Uid 指令可应用于属性元素,并因此将其中的值标记为应在 WPF 输出 BAML 中本地化或通过其他技术本地化的值。
WPF 中的树。)
对于同时支持特性语法和属性元素语法的属性,尽管这两种语法的细微之处(如空白处理)略有不同,但它们的结果通常是一样的。
集合语法
.NET 中的常规 XAML 处理器实现基于托管代码和 CLR,并且该处理器实现通过以下各项之一标识集合类型:
-
IList。
-
IDictionary。
-
x:Array 标记扩展)。
TriggerCollection 的项类型。
<Style.Triggers>
<Trigger Property="Button.IsMouseOver" Value="true">
<Setter Property = "Background" Value="Red"/>
</Trigger>
<Trigger Property="Button.IsPressed" Value="true">
<Setter Property = "Foreground" Value="Green"/>
</Trigger>
</Style.Triggers>
</Style>
属性可以既是一个集合类型,又是该类型和派生类型的 XAML 内容属性,本主题的下一节将讨论这种情况。
通常,父类型的构造函数对作为其属性之一的集合执行实例化,然后最初为空的集合将成为对象树的一部分。
|
|
|---|
|
IDictionary)。 |
在集合类型的 .NET 参考页中,这种特意省略集合的对象元素的语法在 XAML 语法部分中有时称为“隐式集合语法”。
Load)的行为中得到加强。
GradientStopCollection) 的对象元素的语法。
<LinearGradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Offset="0.0" Color="Red" />
<GradientStop Offset="1.0" Color="Blue" />
</GradientStopCollection>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
TriggerCollection 没有默认构造函数。
XAML 内容属性
<Button.Background>Blue</Button.Background>
blue button</Button>
这在本质上是非法的,因为如果此语法是通过使用内容属性的属性元素语法而变为显式的,则内容属性将设置两次:
<Button.Content>I am a </Button.Content>
<Button.Background>Blue</Button.Background>
<Button.Content> blue button</Button.Content>
</Button>
一个类似的非法示例是,如果内容属性是一个集合,则子元素是与属性元素交错的:
<Button>This example</Button>
<StackPanel.Resources>
<SolidColorBrush x:Key="BlueBrush" Color="Blue"/>
</StackPanel.Resources>
<Button>... is illegal XAML</Button>
</StackPanel>
内容属性和集合语法组合
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<StackPanel>
<Button>Button 1</Button>
<Button>Button 2</Button>
<Button>Button 3</Button>
</StackPanel>
</Page>
UIElementCollection 唯一的用途就是作为隐式集合,因此它不公开公共的默认构造函数,因此不能实例化为对象元素。
在具有内容属性的对象中混合使用属性元素和对象元素
针对混合使用属性元素和内容的这一限制由 WPF XAML 处理器强制实施。
但是,一旦内容后面跟有属性元素,您就不能进一步引入任何内容,而只能添加属性元素。
然而,这仍然是使内部文本保持连续的不错的标记样式,原因是,如果属性元素与内部文本交错分布,则很难直观地检测标记中的大量空白。
以下各节描述 XAML 处理器在技术上支持的 XAML 用法,但这些用法会产生冗长的内容或其他美观上的问题,当您开发包含 XAML 源的应用程序时,这些问题会对保持可读的 XAML 文件产生影响。
属性元素的可选用法
或者,属性元素的隐式用法有时可以避免使用在技术上具有功能,但在视觉上容易引起混淆(如在特性值中嵌套标记扩展)的标记。
typeName.memberName 全限定特性
Background 特性的三个引用是完全等效的:
<Button Button.Background="Blue">Button.Background</Button>
<Button Control.Background="Blue">Control.Background</Button>
Button 的基类。
成员名 格式示例并不适用,因此显示为已注释掉:
Label.Background 不是可用的附加属性,因此这个用法将失败。
baseTypeName.memberName 属性元素
例如,下面的语法适用:
<Control.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="Yellow" Offset="0.0" />
<GradientStop Color="LimeGreen" Offset="1.0" />
</LinearGradientBrush>
</Control.Background>
</Button>
Control.Background 形式提供。
成员名称”在标记中不是良好的样式,应当避免使用这种形式。