XAML学习文档.docx
《XAML学习文档.docx》由会员分享,可在线阅读,更多相关《XAML学习文档.docx(68页珍藏版)》请在冰豆网上搜索。
XAML学习文档
Xaml概述(wpf)
发送反馈
本主题介绍XAML语言的功能,并演示如何使用XAML编写WindowsPresentationFoundation(WPF)应用程序。
本主题专门介绍WPF实现的XAML。
XAML本身是一个比WPF大的语言概念。
本主题包括下列各节。
∙什么是XAML?
∙XAML语法概述
∙XAML中的大小写和空白
∙标记扩展
∙类型转换器
∙XAML根元素和XAML命名空间
∙XAML中的自定义前缀和自定义类型
∙事件和XAML代码隐藏
∙XAML命名元素
∙附加属性和附加事件
∙基类型和XAML
∙XAML安全性
∙从代码中加载XAML
∙接下来的内容
∙相关主题
什么是XAML?
XAML是一种声明性标记语言。
如同应用于.NETFramework编程模型一样,XAML简化了为.NETFramework应用程序创建UI的过程。
您可以在声明性XAML标记中创建可见的UI元素,然后使用代码隐藏文件(通过分部类定义与标记相连接)将UI定义与运行时逻辑相分离。
XAML直接以程序集中定义的一组特定后备类型表示对象的实例化。
这与大多数其他标记语言不同,后者通常是与后备类型系统没有此类直接关系的解释语言。
XAML实现了一个工作流,通过此工作流,各方可以采用不同的工具来处理应用程序的UI和逻辑。
以文本表示时,XAML文件是通常具有 .xaml 扩展名的XML文件。
可通过任何XML编码对文件进行编码,但通常编码为UTF-8。
下面的示例演示如何创建作为UI一部分的按钮。
此示例的目的仅在于供您初步了解XAML是如何表示常用UI编程形式的(它不是一个完整的示例)。
XAML
打印
XAML语法概述
下面的章节介绍XAML语法的基本形式,并提供一个简短的标记示例。
这些章节并不提供每个语法形式的完整信息,例如这些语法如何在后备类型系统中表示。
有关本主题中介绍的每种语法形式在XAML语法中的详情的更多信息,请参见 XAML语法详述。
如果您以前熟悉XML语言,则下面几节中的很多材料对您而言都是基础知识。
这是XAML的其中一个基本设计原则的结果。
XAML语言定义它自己的概念,但这些概念在XML语言和标记形式内发挥作用。
XAML对象元素
对象元素通常声明类型的实例。
该类型在为以XAML为语言的技术提供后备类型的程序集中定义。
对象元素语法始终以左尖括号(<)开头,后跟要创建实例的类型的名称。
(该名称可能包含前缀,前缀的概念会在后面解释。
)在此之后,您可以选择声明该对象元素的特性。
要完成对象元素标记,请以右尖括号(>)结尾。
您也可以使用不含任何内容的自结束形式,方法是用一个正斜杠后接一个右尖括号(/>)来完成标记。
例如,请再次查看前面演示的标记代码段:
XAML
打印
此示例指定了两个对象元素:
(含有内容,后面有一个结束标记)和 (自结束形式,包含几个特性)。
对象元素 StackPanel 和 Button 各映射到一个类名,这些类由WPF定义并且是WPF程序集的一部分。
指定对象元素标记时会创建一条XAML处理指令来创建一个新实例。
每个实例都是在分析和加载XAML时通过调用基础类型的默认构造函数来创建的。
特性语法(属性)
对象的属性通常可表示为对象元素的特性。
特性语法命名在特性语法中设置的属性,后跟赋值运算符(=)。
特性的值始终以包含在引号中的字符串的形式进行指定。
特性语法是最简单有效的属性设置语法,并且对于曾使用过标记语言的开发人员而言在使用中是最直观的语法。
例如,以下标记将创建一个具有红色文本和蓝色背景的按钮,还将创建指定为 Content 的显示文本。
XAML
打印
属性元素语法
对于对象元素的某些属性,特性语法是不可能实现的,因为无法在特性语法的引号和字符串限制内充分地表达提供属性值所必需的对象或信息。
对于这些情况,可以使用另一个语法,即属性元素语法。
属性元素开始标记的语法为 <类型名称.属性名称>。
通常,该标记的内容是类型的一个对象元素,属性会将该元素作为其值。
指定内容之后,必须用一个结束标记结束属性元素。
结束标记的语法为 类型名称.属性名称>。
如果可以使用特性语法,那么使用特性语法通常更为方便,且能够实现更为精简的标记,但这通常只是一个风格的问题,而不属于技术限制。
下面的示例演示了在前面的特性语法示例中设置的相同属性,但这次对 Button 的所有属性使用了属性元素语法。
XAML
打印
Thisisabutton
集合语法
XAML语言包含一些优化,可以生成可读性更好的标记。
其中的一项优化是:
如果某个特定属性采用集合类型,则您在标记中声明为该属性的值内的子元素的项将成为集合的一部分。
在这种情况下,子对象元素的集合是设置为集合属性的值。
下面的示例演示为 GradientStops 属性设置值的集合语法:
XAML
打印
--noexplicitnewGradientStopCollection,parserknowshowtofindorcreate-->
XAML内容属性
XAML指定了一个语言功能,通过该功能,一个类可以指定它的一个且仅一个属性为XAML内容属性。
该对象元素的子元素用于设置该内容属性的值。
换言之,仅对内容属性而言,您可以在XAML标记中设置该属性时省略属性元素,并在标记中生成更直观的父级/子级形式。
例如, Border 指定内容属性 Child。
系统处理下面两个 Border 元素的方式相同。
第一个元素利用了内容属性语法而省略了 Border.Child 属性元素。
第二个元素显式标明Border.Child。
XAML
打印
--explicitequivalent-->
作为XAML语言的规则,XAML内容属性的值必须完全在该对象元素的其他任何属性元素之前或之后指定。
例如,下面的标记无法进行编译:
打印
Blue
bluebutton
有关XAML内容属性的此项限制的更多信息,请参见 XAML语法详述的“XAML内容属性”一节。
文本内容
有少量XAML元素可直接将文本作为其内容来处理。
若要实现此功能,必须满足以下条件之一:
∙类必须声明一个内容属性,并且该内容属性必须是可赋值给字符串的类型(该类型可以是 Object)。
例如,任何 ContentControl 都将 Content 用作其内容属性,并且其类型为 Object,这样就支持实际的 ContentControl(例如, Button)上的如下用法:
。
∙类型必须声明一个类型转换器,该类型转换器将文本内容用作其初始化文本。
例如, Blue。
这种情况实际上并不常见。
∙类型必须为已知的XAML语言基元。
内容属性和集合语法组合
请看以下示例:
XAML
打印
此例中,每个 Button 都是 StackPanel 的一个子元素。
这是一个简单直观的标记,其中出于两个不同的原因省略了两个标记。
∙省略的StackPanel.Children属性元素:
StackPanel 从 Panel 派生。
Panel 将 Panel .Children 定义为其XAML内容属性。
∙省略的UIElementCollection对象元素:
Panel .Children 属性采用类型 UIElementCollection,该类型实现 IList。
根据处理集合(例如 IList)的XAML规则,集合的元素标记可以省略。
(在这种情况下, UIElementCollection 实际无法实例化,因为它没有公开默认构造函数,这就是 UIElementCollection 对象元素以注释形式出现的原因。
)
XAML
打印
---->
---->
特性语法(事件)
特性语法还可用于事件成员,而不仅限于属性成员。
在这种情况下,特性的名称为事件的名称。
在XAML事件的WPF实现中,特性的值是实现该事件的委托的处理程序的名称。
例如,以下标记将 Click 事件的一个处理程序指定给在标记中创建的 Button:
XAML
打印
xmlns="
xmlns:
x="
x:
Class="ExampleNamespace.ExamplePage">
ClickMe!
除此特性语法示例外,还有更多关于WPF中的事件和XAML的内容。
例如,您可能希望了解此处引用的 ClickHandler 表示什么,以及它是如何定义的。
这将在本主题中后面的 事件和XAML代码隐藏一节中解释。
XAML中的大小写和空白
XAML通常区分大小写。
出于解析后备类型的目的,WPFXAML按照CLR区分大小写的相同规则区分大小写。
按名称与程序集中的基础类型进行比较或者与类型的成员进行比较时,对象元素、属性元素和特性名称均必须使用区分大小写的形式指定。
XAML语言关键字和基元也区分大小写。
值并不总是区分大小写。
值是否区分大小写将取决于与采用该值的属性关联的类型转换器行为,或取决于属性值类型。
例如,采用 Boolean 类型的属性可以采用 true 或 True 作为等效值,但只是因为将字符串转换为 Boolean 的本机WPFXAML分析器类型转换已经允许将这些值作为等效值。
WPFXAML处理器和序列化程序将忽略或删除所有无意义的空白,并规范化任何有意义的空白。
这与XAML规范的默认空白行为建议一致。
通常,只有当您在XAML内容属性中指定字符串时,此行为的重要性才会体现出来。
简言之,XAML将空格、换行符和制表符转化为空格,如果它们出现在一个连续字符串的任一端,则保留一个空格。
有关XAML空白处理的完整说明不属于本主题的讨论范围。
有关详细信息,请参见 XAML中的空白处理。
标记扩展
标记扩展是一个XAML语言概念。
当用于提供特性语法的值时,大括号( { 和 })表示标记扩展用法。
此用法指示XAML处理系统不要像通常那样将特性值视为一个文本字符串或者可转换为字符串的值。
WPF应用程序编程中最常用的标记扩展是 Binding(用于数据绑定表达式)以及资源引用 StaticResource 和 DynamicResource。
通过使用标记扩展,即使属性通常不支持特性语法,也可以使用特性语法为属性提供值。
标记扩展经常使用中间表达式类型实现一些功能,例如,推迟值或引用仅在运行时才存在的其他对象。
例如,下面的标记使用特性语法设置 Style 属性的值。
Style 属性采用了 Style 类的一个实例,该实例默认情况下未能用特性语法字符串实例化。
但在本例中,特性引用了特定的标记扩展 StaticResource。
当处理该标记扩展时,它返回对以前在资源字典中作为键控资源进行实例化的某个样式的引用。
XAML
打印
Key="MyBrush"Color="Gold"/>
Key="PageBackground">
...
...
有关特定在WPF中实现的所有XAML标记扩展的参考列表,请参见 WPFXAML扩展。
有关由System.Xaml定义并且可更广泛用于.NETXAML实现的标记扩展的参考列表,请参见XAML命名空间(x:
)语言功能。
有关标记扩展概念的更多信息,请参见 标记扩展和WPFXAML。
类型转换器
在 特性语法一节中,曾提到特性值必须能够使用字符串进行设置。
对字符串如何转换为其他对象类型或基元值的基本本机处理取决于 String 类型本身,以及对某些类型(如DateTime 或 Uri)的本机处理。
但是很多WPF类型或这些类型的成员扩展了基本字符串特性处理行为,因此可以指定更复杂的对象类型的实例作为字符串和特性。
Thickness 结构是一个类型示例,该类型拥有可使用XAML的类型转换。
Thickness 指示嵌套矩形中的度量并用作一些属性(如 Margin)的值。
通过对 Thickness 设置类型转换器,所有使用 Thickness 的属性都可以更容易地在XAML中指定,因为它们可指定为特性。
下面的示例使用类型转换和特性语法来为 Margin 提供值:
XAML
打印
上面的特性语法示例与下面更为详细的语法示例等效,但在下面的示例中, Margin 改为通过包含 Thickness 对象元素的属性元素语法进行设置。
而且设置 Thickness 的四个关键属性作为新实例的特性:
XAML
打印
说明
还有少数对象只能通过类型转换这种公开方式在不涉及到子类的情况下为该类型设置属性,因为类型本身并没有默认构造函数。
一个示例是 Cursor。
有关如何支持类型转换及其在特性语法上的应用的更多信息,请参见 TypeConverters和XAML。
XAML根元素和XAML命名空间
一个XAML文件只能有一个根元素,这样才能同时成为格式正确的XML文件和有效的XAML文件。
对于典型的WPF方案,将使用在WPF应用程序模型中具有重要意义的根元素(例如,为页使用 Window 或 Page,为外部字典使用 ResourceDictionary 或为应用程序定义使用 Application)。
下面的示例演示WPF页的典型XAML文件的根元素,此根元素为Page。
XAML
打印
xmlns="
xmlns:
x="
...
根元素还包含特性 xmlns 和 xmlns:
x。
这些特性向XAML处理器指明哪些XAML命名空间包含标记将要作为元素引用的后备类型的类型定义。
xmlns 特性明确指示默认的XAML命名空间。
在默认的XAML命名空间中,可以不使用前缀指定标记中的对象元素。
对于大多数WPF应用程序方案以及SDK的WPF部分中给出的几乎所有示例,默认的XAML命名空间均映射到为WPF命名空间 特性指示另外一个XAML命名空间,该命名空间映射XAML语言命名空间
使用 xmlns 定义用法范围和名称范围映射的做法符合XML1.0规范。
XAML名称范围与XML名称范围的不同仅在于:
XAML名称范围还包含有关进行类型解析和分析XAML时名称范围的元素如何受类型支持的信息。
请注意,只有在每个XAML文件的根元素上, xmlns 特性才是绝对必需的。
xmlns 定义将适用于根元素的所有子代元素(此行为也符合 xmlns 的XML1.0规范。
)同时允许根以下的其他元素上具有 xmlns 特性,这些特性将适用于定义元素的任何子代元素。
但是,频繁定义或重新定义XAML命名空间可能会导致XAML标记样式难以阅读。
其XAML处理器的WPF实现包括可识别WPF核心程序集的基础结构。
已知WPF核心程序集包含支持WPF到默认XAML命名空间的映射的类型。
这是通过属于项目生成文件以及WPF生成和项目系统一部分的配置来实现的。
因此,为了引用来自WPF程序集的XAML元素,只需将默认XAML命名空间声明为默认 xmlns。
x:
前缀
在上面的根元素示例中,前缀 x:
用于映射XAML命名空间XAML语言构造的专用XAML命名空间。
在这整个SDK的项目模板、示例以及文档中,此 x:
前缀用于映射该XAML命名空间。
XAML语言的XAML命名空间包含多个将在XAML中频繁用到的编程构造。
下面列出了将用到的最常见的x:
前缀编程构造:
∙x:
Key:
为 ResourceDictionary(或其他框架中的类似字典概念)中的每个资源设置唯一的键。
在典型的WPF应用程序标记中的所有 x:
用法中, x:
Key 将可能占到90%。
∙x:
Class:
向为XAML页提供代码隐藏的类指定CLR命名空间和类名。
必须具有这样一个类才能支持每个WPF编程模型的代码隐藏,而正是因此,即使没有资源,也几乎总是能看到映射的 x:
。
∙x:
Name:
处理对象元素后,为运行时代码中存在的实例指定运行时对象名称。
通常,您将为 x:
Name 经常使用WPF定义的等效属性。
此类属性特定映射到CLR后备属性,因此更便于进行应用程序编程,在应用程序编程中,您经常使用运行时代码从初始化的XAML中查找命名元素。
最常见的此类属性是 FrameworkElement .Name 。
在特定类型中不支持等效的WPF框架级 Name 属性时,仍然可以使用 x:
Name。
某些动画方案中会发生这种情况。
∙x:
Static:
启用一个返回静态值的引用,该静态值只能是一个XAML兼容属性。
∙x:
Type:
根据类型名称构造一个 Type 引用。
它用于指定采用 Type(例如 Style .TargetType )的特性,但属性经常具有本机的字符串到 Type 的转换功能,因此使用x:
Type 标记扩展用法是可选的。
x:
前缀/XAML命名空间中还有其他一些不太常见的编程构造。
有关详细信息,请参见 XAML命名空间(x:
)语言功能。
XAML中的自定义前缀和自定义类型
对于您自己的自定义程序集或PresentationCore、PresentationFramework和WindowsBase的WPF核心以外的程序集,可以将该程序集指定为自定义 xmlns 映射的一部分。
只要该类型能够正确地实现以支持您所尝试的XAML用法,就可以在XAML中引用该程序集中的类型。
下面是一个说明自定义前缀如何在XAML标记中工作的基本示例。
前缀 custom 在根元素标记中定义,并映射为随应用程序一同打包并可用于该应用程序的一个特定程序集。
此程序集包含 NumericUpDown 类型,实现该类型的目的是在支持常规XAML用法之外,还可以使用允许在WPFXAML内容模型的此特定点执行插入的类继承。
通过使用该前缀,此NumericUpDown 控件的一个实例声明为对象元素,以便XAML分析器可找到包含该类型的XAML命名空间,从而找到包含该类型定义的后备程序集的位置。
打印
xmlns="
xmlns:
x="http:
//sch