导出 (0) 打印
全部展开
此文章由人工翻译。 将光标移到文章的句子上,以查看原文。
译文
原文

XAML 概述

Silverlight

可扩展应用程序标记语言 (XAML) 是一种声明性语言。 具体来说,XAML 可以通过使用一种语言结构来显示多个对象之间的分层关系,并使用一种后备类型约定来支持类型扩展,以初始化对象并设置对象的属性。 您可以使用声明性 XAML 标记创建可见用户界面 (UI) 元素。 然后,您可以使用单独的代码隐藏文件来响应事件和处理您在 XAML 中声明的对象。 XAML 语言支持在开发过程中在不同工具和角色之间互换源代码而不会丢失信息,如在 Visual Studio 和 Microsoft Expression Blend 之间交换 XAML 源代码。

XAML 文件是通常具有 .xaml 文件扩展名的 XML 文件。 下面的示例演示非常基本的 Silverlight XAML 文件的内容。

<UserControl x:Class="MySilverlight.Page"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
>
  <Grid Background="OldLace">
  </Grid>
</UserControl>

在 Silverlight 体系结构和 Silverlight 应用程序开发过程中,XAML 发挥着多种重要作用。

  • XAML 是用于声明 Silverlight UI 及该 UI 中元素的主要格式。 通常,项目中至少有一个 XAML 文件表示应用程序中用于最初显示的 UI 的“页面”比喻。 其他 XAML 文件可能声明其他用于导航 UI 或模式替换 UI 的页。 另外一些 XAML 文件可以声明资源,如模板或其他可以重用或替换的应用程序元素。

  • XAML 是用于声明样式和模板的格式,这些样式和模板应用于 Silverlight 控件和 UI 的逻辑基础。 您可以执行此操作来模板化现有控件,或作为为控件提供默认模板的控件作者来执行此操作。 当用来定义样式和模板时,XAML 通常被声明为一个具有 ResourceDictionary 根的 XAML 文件。

  • XAML 是用于为创建 Silverlight UI 和在不同设计器应用程序之间交换 UI 设计提供设计器支持的常见格式。 最值得注意的是,Silverlight 应用程序的 XAML 可在 Expression Blend 产品与 Visual Studio 之间互换。

  • WPF 还在 XAML 中定义其 UI。 就与 WPF XAML 的关系而言,Silverlight XAML 使用共享的默认 XAML 命名空间,且对于其 XAML 词汇具有近似的 WPF 子集关系。 因此,XAML 为 UI 在 Silverlight 与 WPF 之间迁移提供了一种有效途径,这样,您就可以针对 Silverlight 执行 UI 设计,然后几乎无需重新设计 UI 图面即可将此相同设计迁移到 WPF。

  • Silverlight XAML 定义 UI 的可视外观,而关联的代码隐藏文件定义逻辑。 可以对 UI 设计进行调整,而不必更改代码隐藏中的逻辑。 就此作用而言,XAML 简化了负责主要可视化设计的人员与负责应用程序逻辑和信息设计的人员之间的工作流。

  • 由于支持可视化设计器和设计图面,因此,XAML 支持在早期开发阶段快速构造 UI 原型,并在整个开发过程中使设计的组成元素更可能保留为代码访问点,即使可视化设计发生了巨大变化也不例外。

根据您自己在开发过程中所扮演的角色,您可能无法广泛地与 XAML 语言或 XAML 语法交互。 您与 Silverlight XAML 交互的程度还取决于您所使用的开发环境、是否使用交互式设计环境功能(如工具箱和属性编辑器)以及 Silverlight 应用程序的范围和目的。 尽管如此,在开发 Silverlight 应用程序的过程中,您还是可能能够使用基于文本的编辑器在元素级编辑 Silverlight XAML 文件。 本主题旨在使您了解 XAML 语言和 XAML 语法的具体信息。 此外,本主题还着重介绍 XAML 可能特定于 Silverlight 的用法和行为的某些方面(与其他利用 XAML 的框架(如 WPF 或 WCF)相对照)。 使用此信息,您应能够放心地以文本表示形式编辑用于 Silverlight 的 XAML,当此 XAML 文件由工具、标记编译操作或 Silverlight 运行时加载应用程序使用时,保持其声明和目的的有效性。

按照针对编程的广泛定义,命名空间确定如何解释引用编程实体的字符串标记。 如果重复使用字符串标记,命名空间还可以解决多义性。 命名空间概念的存在使得编程框架能够区分用户声明的标记与框架声明的标记,并通过命名空间限定来消除可能的标记冲突,以及等等。 XAML 命名空间是为 XML 语言提供此用途的命名空间概念。 就 XAML 的常规作用及其面向 Silverlight 的应用程序而言,XAML 用于声明对象、这些对象的属性和对象-属性关系(表示为层次结构)。 您声明的对象由类型库提供支持。 相关的库可以是以下任意一项:

  • Silverlight 核心库(任何分布式运行时都提供了它们)。

  • 分布式库,它们是您在包中再分发的 Silverlight SDK 的一部分(可能带有应用程序库缓存选项)。

  • 表示您的应用程序中融入的和您的应用程序包再分发的第三方控件的定义的库。

  • 您自己的库,这是您通过 Silverlight 项目创建、用于容纳某些或所有应用程序的 Silverlight 用户代码的库。

  • 其他库,也即,您在单独的项目中定义,并使用若干 Web 部署策略之一通过 Silverlight 应用程序模型进行引用的库。

XAML 命名空间概念使用标记中提供的 XML 样式命名空间声明 (xmlns),并将后备类型信息与特定的 XAML 命名空间关联。 XAML 命名空间标识符可以 URI 或 CLR 命名空间 中的字符串标记以及程序集信息。 这使得读取 XAML 文件的 XAML 处理器能够区分标记 (markup) 中的标记 (token),并且,在创建运行时对象表示形式时,该处理器能够从与该 XAML 命名空间关联的后备程序集中查找类型和成员。

XAML 文件几乎始终在其根元素中声明一个默认的 XAML 命名空间。 默认 XAML 命名空间定义可以声明哪些元素,而无需通过前缀进一步进行限定。 例如,如果您声明一个元素 <Balloon />,则该元素 Balloon 应存在且在默认 XAML 命名空间中有效。 相反,如果 Balloon 不在所定义的默认 XAML 命名空间中,则您必须转而使用一个前缀来限定该引用,例如,<party:Balloon /> 该前缀指示此实体存在于与默认命名空间不同的 XAML 命名空间中,尤其是,您已将某个 XAML 命名空间映射到前缀 party 以便于使用。

XAML 命名空间应用于声明它们的特定元素,同时应用于 XAML 结构中该元素所包含的任何元素。 因此,XAML 命名空间几乎始终在根元素上声明,以充分利用此继承概念。 有关 XAML 命名空间和继承概念的更多信息,请参见 Silverlight XAML 命名空间以及将 XAML 命名空间映射为前缀

在 Silverlight 中,默认 XAML 命名空间包括核心库 System.Windows.dll 中几乎所有对在 XAML 中进行声明有用的 Silverlight 定义类型。 默认的 XAML 命名空间可以忽略 CLR 命名空间限定,其便利性类似于在代码文件中使用 usingImports 语句。 差别在于默认的 XAML 命名空间可以包含可能来自多个 CLR 命名空间的类型。 例如,使用默认的 Silverlight XAML 命名空间时,<Button /> 引用 System.Windows.Controls.Button,而 <ImageBrush /> 引用 System.Windows.Media.ImageBrush 之所以这样,原因是 System.Windows.ControlsSystem.Windows.Media CLR 命名空间同时映射到 Silverlight 的默认 XAML 命名空间(由构造核心库的方式所声明)。

作为 Silverlight SDK 的一部分分发的 Silverlight 库通常要求前缀映射,然后才能在 XAML 中使用其类型。

SDK 库具有 CLR 特性,以便加载程序集的设计器可以建议使用特定的前缀。 在 Visual Studio 中,对于已由某个项目引用的任何程序集,您都可以使用自动完成功能从所引用的程序中读取 CLR 特性。 这一 Visual Studio 功能要么将所有可能的 XAML 命名空间显示为下拉列表,要么使用建议的前缀作为提示以帮助建议特定的映射选择。

Silverlight SDK 程序集定义基于 URI 的 XAML 命名空间,使库中的多个库和多个 CLR 命名空间能够共享 XAML 命名空间。 有关更多信息,请参见 Silverlight 库的前缀和映射

来自除 Silverlight 核心库之外的其他库的类型将要求您使用前缀声明和映射 XAML 命名空间,然后才能从该库中引用类型。 通常情况下,如果库不支持基于 URI 的 XAML 命名空间,访问在 XAML 中的库类型所需的 XAML 命名空间声明要求三条信息:

  • 一个前缀,它定义用于在后续 XAML 标记中引用该 XAML 命名空间的标记 (markup) 标记 (token)。

  • 在该 XAML 命名空间中定义元素的后备类型的程序集,XAML 处理器必须访问此程序集才能基于 XAML 声明创建对象。

  • 该程序集中的一个 CLR 命名空间。

有关 XAML 命名空间(包括来自用户代码的映射自定义类型或来自第三方库的类型)的更多信息,请参见 Silverlight XAML 命名空间以及将 XAML 命名空间映射为前缀

XAML 语言 XAML 命名空间

在几乎每个 Silverlight XAML 文件中声明的一个特定的 XAML 命名空间是针对由 XAML 语言定义的元素的 XAML 命名空间。 根据约定,XAML 语言 XAML 命名空间映射到前缀 x: Silverlight 项目的默认项目和文件模板始终同时将默认的 XAML 命名空间(无前缀,只有 xmlns=)和 XAML 语言命名空间(映射到前缀 x:)定义为根元素的一部分。 例如,以下示例代码段是 Silverlight 应用程序初始页的模板创建的 UserControl 根(只显示开始标记且已简化):

<UserControl  
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
...>

x: 前缀/XAML 语言 XAML 命名空间包含多个将在 Silverlight XAML 中频繁使用的编程构造。 下面列出了最常见的 x: 前缀/XAML 命名空间构造:

  • x:Key:为 ResourceDictionary 中的每个资源设置一个唯一用户定义键。 关键标记字符串用作 StaticResource 标记扩展 的参数来检索来自另一个 XAML 用法的任何此类资源。

  • x:Class:指定为 XAML 页提供代码隐藏的类的 CLR 命名空间和类名称,并命名由标记编译器的生成操作在 Silverlight 应用程序模型中创建或链接的类。 您必须具有一个这样的类才能支持代码隐藏或支持初始化为 RootVisual 正是出于这些原因,所以您几乎总是看到映射了 x:,即使没有任何资源且您从不使用 x:Name 也不例外。

  • x:Name:处理 XAML 中定义的对象元素后,为运行时代码中存在的实例指定运行时对象名称。 对于不支持更为方便的 FrameworkElement.Name 属性的非常见情形,您可以将 x:Name 用于元素命名方案。

XAML 语言 XAML 命名空间中还有其他一些不太常见的编程构造。 有关详细信息,请参见 XAML 命名空间 (x:) 语言功能

其他 XAML 命名空间

您可能会遇到一些用于 Silverlight 的 XAML 文件,它们定义前缀 d:(对于设计器命名空间)和 mc:(用于实现标记兼容)。 一般情况下,它们用于提供基础结构支持以便能够在工具或过程之间交换 XAML,并且,在典型的 Silverlight XAML 中,您不需要与这些命名空间中的元素交互。 有关更多信息,请参见 Silverlight XAML 命名空间以及将 XAML 命名空间映射为前缀中的“其他 XAML 命名空间”部分。 有关 sdk: 前缀的更多信息,请参见 Silverlight 库的前缀和映射

由于遗留原因,Silverlight XAML 还支持另一个基于 URI 命名空间 http://schemas.microsoft.com/client/2007 作为可能的默认 XAML 命名空间。 通常,您应该为 Silverlight 应用程序编程使用 http://schemas.microsoft.com/winfx/2006/xaml/presentation 作为默认的 XAML 命名空间,而不应为当前应用程序使用 http://schemas.microsoft.com/client/2007

一个 XAML 文件始终只有一个元素作为其根,该元素声明的一个对象将作为某些编程结构(如页面)的概念根,或者是应用程序的整个运行时定义的对象图。

根据 XAML 语法,可以通过三种方法在 XAML 中声明对象:

  • 直接使用对象元素语法:使用开始标记和结束标记将对象实例化为 XML 格式的元素。 可以使用此语法声明根对象或创建用于设置属性值的嵌套对象。

  • 间接使用属性语法:使用内联字符串值声明对象。 在概念上,这可能用于实例化除根之外的任何对象。 可以使用此语法设置属性值。 这是一个针对 XAML 处理器的间接操作,因为必须有某个过程知道如何在了解正设置哪个属性、该属性的类型系统特性和所提供的字符串值的基础上创建新对象。 通常,这表明相关类型或属性要么支持可处理字符串输入的类型转换器,要么 XAML 分析器支持进行本机转换。

  • 使用标记扩展:标记扩展概念将在本主题的后面章节中介绍。

这并不意味着您始终可以选择使用任何语法以给定的 XAML 词汇创建对象。 词汇中的某些对象只能使用对象元素语法创建。 少量对象只能通过初始设置为属性值来创建。 事实上,在 Silverlight 中,可以使用对象元素或属性语法创建的对象比较少。 即使这两种语法格式都是可能的,也只有其中一种语法格式占主流或是最适合方案使用的格式。

除了以等同于实例化对象的方式声明对象之外,XAML 中还提供了一些可用来引用现有对象的方法。 这些对象可能在 XAML 的其他区域中定义,或者通过平台及其应用程序或编程模型的某种行为隐式存在。 使用对象引用在标记扩展 一节中将进行详细讨论。

使用对象元素语法声明对象

若要使用对象元素语法声明对象,需要使用以下模式编写标记,其中,objectName 是要实例化的类型的名称。 在本文档中,经常出现术语“对象元素用法”,这是用于用对象元素语法创建对象的特定标记的简称。

< objectName >

</ objectName >

下面的示例是用于声明 Canvas 对象的对象元素用法。

<Canvas>
</Canvas>

许多 Silverlight 对象(例如 Canvas)可以包含其他对象。

<Canvas>
  <Rectangle>
  </Rectangle>
</Canvas>

为方便起见(且作为 XAML 与 XML 的一般关系的一部分),如果对象不包含其他对象,则可以使用一个自结束标记(而不是开始/结束标记对)来声明对象元素,如下面示例中的 <Rectangle /> 标记所示。

<Canvas>
  <Rectangle />
</Canvas>

使用属性语法声明对象

在某些情况下,属性 (Property) 值并不只是语言基元(如字符串),此时可以使用属性 (Attribute) 语法来实例化设置该属性 (Property) 的对象,并初始化用于定义新对象的键属性 (Property)。 由于此行为绑定到属性 (Property) 设置,请参见以下各节了解有关如何使用属性 (Attribute) 语法在一个语法步骤中声明对象并设置其属性 (Property) 的信息。

初始化文本

有时,您可以声明对象以及所包含的用于为构造提供初始值的内部文本。 在 XAML 中,这种方法和语法称为初始化文本。 从概念上来说,初始化文本类似于调用具有参数的构造函数,但内部的 XAML 分析器实现通常不按原意来完成。

初始化文本在 Silverlight 中很有用,用来设置某些结构的初始值。 如果您希望在资源字典中创建结构示例,则可以使用此方法,因为您打算将该结构值共享给多个目标属性。 在某些结构中,您无法使用属性语法来设置结构的值。 存在此问题的结构是:GridLength; Color

注意 说明:

如果针对 Silverlight 4;这个问题影响着附加结构;有关更多信息,请参见 Silverlight 版本之间的 XAML 处理差异

可以设置使用对象元素语法声明的对象的属性。 可以通过多种方法使用 XAML 设置属性:

  • 使用属性语法。

  • 使用属性元素语法。

  • 使用内容元素语法。

  • 使用集合语法(通常是隐式集合语法)。

对于对象声明,用于在 XAML 中设置对象属性的此方法列表并不表示可以使用这些方法中的任何一种来设置给定的属性。 某些属性只支持其中一种方法。 某些属性 (Property) 可能支持组合;例如,支持内容元素语法的属性 (Property) 可能还通过属性 (Property) 元素语法或备选属性 (Attribute) 语法支持更详细的格式。 这取决于属性和属性使用的对象类型。 可用 XAML 设置的每个属性的参考页的"XAML 用法"部分指出了使用 XAML 语法的可能性。 Silverlight 中的对象还有一些无论使用任何方式都无法使用 XAML 设置的属性,只能使用代码来设置这些属性。

无论使用任何方式(包括 XAML 或代码)都无法设置只读属性,除非有其他机制适用。 该机制可能是调用一个设置为属性的内部表示形式的构造函数重载、一个并非是严格意义上的属性访问器的帮助器方法或一个计算属性。 计算属性依赖于其他可设置属性的值,以及服务或行为对该属性值的可能影响;而这些功能在依赖项属性系统中提供。 有关依赖项属性的更多信息,请参见依赖项属性概述

XAML 中的集合语法给出了一种您正在设置只读属性的假象,但实际上您并非如此。 请参见使用集合语法设置属性

使用属性 (Attribute) 语法设置属性 (Property)

使用以下语法,其中 objectName 是要实例化的对象,propertyName 是要对该对象设置的属性的名称,propertyValue 是要设置的值。

< objectName   propertyName =" propertyValue " .../>

-or-

< objectName   propertyName =" propertyValue ">

...<!--element children -->

</ objectName >

使用任何一种语法都可以声明对象并设置该对象的属性。 虽然第一个示例是标记中的单一元素,实际上这里有一些与 XAML 处理器如何分析此标记有关的分离步骤。 首先,对象元素的存在表明必须实例化新的 objectName 对象。 只有存在这样的实例后,才可以对它设置实例属性 propertyName

下面的示例使用四个属性 (Attribute) 的属性 (Attribute) 语法来设置 Rectangle 对象的 NameWidthHeightFill 属性 (Property)。

<Rectangle Name="rectangle1" Width="100" Height="100" Fill="Blue" />

如果您清楚地了解 XAML 分析器如何解释此标记和定义对象树,则等效的代码可能类似以下伪代码:

Rectangle rectangle1 = new Rectangle();

rectangle1.Width=100.0;

rectangle1.Height=100.0;

rectangle1.Fill = new SolidColorBrush(Colors.Blue);

第一行是对默认构造函数的调用。 请注意,Name 的值用作要向其分配构造函数结果的实例名称。 有关 Name 的重要性以及它如何与 Silverlight XAML 分析器行为和 Silverlight 编程模型相关的更多信息,请参见 XAML 名称范围

Name 不同,上述伪代码的第二行到第四行的分配顺序是不确定的。 按照 XAML 的规则,一旦创建了此实例,XAML 分析器就必须能够按任意顺序设置这些属性。

使用属性元素语法设置属性

许多 Silverlight 属性可以使用属性元素语法来设置。 若要使用属性元素语法,必须能够指定对象元素的新实例才能"填充"属性元素值。

若要使用属性元素语法,需要为要设置的属性创建 XML 元素。 这些元素的形式为 <object.property> 在标准的 XML 中,此元素只被视为在名称中有一个点的元素。 但是使用 XAML 时,元素名称中的点将该元素标识为属性元素,且 propertyobject 的属性。

在下面的语法中,property 是要设置的属性的名称,propertyValueAsObjectElement 是声明新对象的新对象元素,其值类型是该属性期望的值。

<object>

< 对象 . 属性 >

propertyValueAsObjectElement

</ 对象 . 属性 >

</ object >

下面的示例使用属性元素语法通过 SolidColorBrush 对象元素来设置 Rectangle 的填充。 (在 SolidColorBrush 中,Color 使用属性语法来设置。)此 XAML 的呈现结果等同于前面使用属性语法设置 Fill 的 XAML 示例。

<Rectangle
  Name="rectangle1"
  Width="100" 
  Height="100"
> 
  <Rectangle.Fill> 
    <SolidColorBrush Color="Blue"/> 
  </Rectangle.Fill>
</Rectangle>

使用 XAML 内容语法设置属性

一些 Silverlight 类型定义了一个启用 XAML 内容元素语法的属性。 在 XAML 内容元素语法中,您可以忽略该属性的属性元素,并可以通过提供所属类型的对象元素标记中的内容来设置该属性。 该内容通常为一个或多个对象元素。 这称为 XAML 内容语法。 如果 XAML 内容语法可用,则 Silverlight 参考文档中针对该属性的“XAML 用法”部分将显示该语法。

例如,BorderChild 属性页显示了 XAML 内容语法(而非属性元素语法),以设置 Border 的单一对象 Child 值。 下面的示例与这一用法类似:

<Border>
  <Button .../>
</Border>

如果声明为 XAML 内容属性的属性也支持“松散”对象模型(在此模型中,属性类型为 Object,或具体而言为类型 String),则可以使用 XAML 内容语法将纯字符串作为内容放入开始对象标记与结束对象标记之间。 例如,TextBlockText 属性 (Property) 页显示了另一种 XAML 语法,该语法使用 XAML 内容语法(而不是属性 (Attribute) 语法)来为 Text 设置一个字符串值。 下面的示例与该用法类似,并设置 TextBlockText 属性,而不显式指定 Text 属性。 将使用 XML 认为是内容或“内部文本”的内容来设置 Text,而不是使用属性 (attribute) 或声明对象元素。

<TextBlock>Hello!</TextBlock>
注意说明:

如果你专门针对 Silverlight 3,请参阅 Silverlight 版本和 WPF 之间的 XAML 处理差异 Silverlight 3 使用的是与 Silverlight 4 不同的 XAML 分析行为。 Silverlight 3 XAML 只支持有限数量的 XAML 内容语法。

使用集合语法设置属性

在 XAML 中,有几个集合语法的变体。 这一眼看上去似乎允许您“设置”只读集合属性。 而实际上,XAML 允许的操作是为一个存在的集合中添加项。 实现 XAML 支持的 XAML 语言和 XAML 处理器依赖于后备集合类型中的约定来启用此语法。

通常,XAML 语法中不存在保留集合项的集合类型的属性(例如,索引器或 Items 属性)。 对于集合而言,XAML 中的集合实际所需的未必是属性,而是方法:Add 方法。 调用 Add 方法就是上述约定。 当 XAML 处理器遇到 XAML 集合语法中的一个或多个对象元素时,首先通过使用其对象标记创建每个此类对象,然后通过调用集合的 Add 方法以声明顺序将每个新对象添加到包含集合中。

下面的示例演示了一个使用可构造集合类型的集合属性(可以定义实际的集合并将其实例化为 XAML 中的一个对象元素)。

<LinearGradientBrush>
  <LinearGradientBrush.GradientStops>
    <!-- Here the GradientStopCollection tag is specified. -->
    <GradientStopCollection>
      <GradientStop Offset="0.0" Color="Red" />
      <GradientStop Offset="1.0" Color="Blue" />
    </GradientStopCollection>
  </LinearGradientBrush.GradientStops>
</LinearGradientBrush>

不过,对于采用集合的 Silverlight 属性而言,XAML 分析器可根据集合所属的属性隐式知道集合的后备类型。 因此,您可以省略集合本身的对象元素,如下面的示例所示。

<LinearGradientBrush>
  <LinearGradientBrush.GradientStops>
    <!-- no explicit new GradientStopCollection, parser knows how to find or create -->
    <GradientStop Offset="0.0" Color="Red" />
    <GradientStop Offset="1.0" Color="Blue" />
  </LinearGradientBrush.GradientStops>
</LinearGradientBrush>

另外,有一些属性不但是集合属性,还标识为类的 XAML 内容属性。 前面示例中以及许多其他 Silverlight 属性中使用的 GradientStops 属性就是这种情况。 在这些语法中,也可以省略属性元素。 这生成以下标记:

<LinearGradientBrush>
  <GradientStop Offset="0.0" Color="Red" />
  <GradientStop Offset="1.0" Color="Blue" />
</LinearGradientBrush>

在广泛用于控件合成的类(如面板、视图或项控件)中,此集合和内容语法的组合是最常见的。 例如,下面的示例演示将两个 UI 元素合成到一个 StackPanel 中的显式 XAML 以及可能的最简单 XAML。

<!--explicit tags, and UIElementCollection commented-->
<StackPanel>
  <StackPanel.Children>
    <!--UIElementCollection-->
    <TextBlock>Hello</TextBlock>
    <TextBlock>World</TextBlock>
    <!--/UIElementCollection-->
  </StackPanel.Children>
</StackPanel>

<!--simple-->
<StackPanel>
  <TextBlock>Hello</TextBlock>
  <TextBlock>World</TextBlock>
</StackPanel>

请注意显式语法中注释掉的 UIElementCollection 将其注释掉是因为即使在对象树中将存在相关集合,也无法在 XAML 中显式指定它。 这是因为 UIElementCollection 不是可构造的类。 您在运行时对象树中获取的值是所属类中的一个默认初始化值,在初始化之后无法更改此值。 在某些情况下,标记中会特意且显式包含集合类(例如,赋予集合一个 x:Name,以便可以在代码中更方便地引用该集合)。 但是,注意不要显式声明由于其后备类型的特征而无法由 XAML 分析器构造的集合类。因为它们正在填充只读集合属性。

何时使用属性 (Attribute) 语法或属性 (Property) 元素语法来设置属性 (property)

所有支持使用 XAML 设置的属性 (Property) 都支持用于直接值设置的属性 (Attribute) 语法或属性 (Property) 元素语法,但可能不会互换支持每种语法。 某些属性支持上述两种语法,某些属性还支持其他语法选项(例如前面所示的 Text 的内容元素语法)。 属性支持的 XAML 语法的类型在某种程度上取决于该属性用作其属性类型的对象的类型。 如果该属性 (Property) 类型为基元类型(例如双精度、整型或字符串),则该属性 (Property) 始终支持属性 (Attribute) 语法。

下面的示例使用属性语法设置 Rectangle 的宽度。 Width 属性 (Property) 支持属性 (Attribute) 语法,这是因为属性 (Property) 值是双精度值。

<Rectangle Width="100" />

如果可以通过对字符串进行类型转换来创建用于设置某属性 (Property) 的对象类型,也可以使用属性 (Attribute) 语法来设置该属性 (Property)。 对于基元,始终是这种情况。 但是,某些其他对象类型也可以使用指定为属性值的字符串(而不是需要对象元素语法)来创建。 此方法使用该特定属性或该属性类型通常所支持的基本类型转换。 属性 (Attribute) 的字符串值经过分析后,字符串信息用于设置对新对象的初始化非常重要的属性 (Property)。 特定类型转换器还可能创建公共属性类型的不同子类,这取决于它处理字符串中的信息的独特方式。 支持此行为的对象类型将使用特殊语法(在本文档的语法部分中列出)。

下面的示例使用属性语法设置 Rectangle 的填充。 当使用 SolidColorBrush 设置 Fill 属性 (property) 时,该属性 (Property) 支持属性 (Attribute) 语法。 这是因为支持 Fill 属性 (Property) 的 Brush 抽象类型支持类型转换语法,该语法可以创建一个通过将属性 (Attribute) 指定的字符串作为其 Color 来初始化的 SolidColorBrush(有关此特定示例的详细信息,请参见 BrushSolidColorBrush)。

<Rectangle Width="100" Height="100" Fill="Blue" />

如果用于设置某属性的对象支持对象元素语法,则可以使用属性元素语法来设置该属性。 如果该对象支持对象元素语法,该属性也支持属性元素语法。 下面的示例使用属性元素语法设置 Rectangle 的填充。 当使用 SolidColorBrush 设置 Fill 属性时,该属性支持属性元素语法,这是因为 SolidColorBrush 支持对象元素语法并满足该属性的使用 Brush 类型设置其值的要求。 SolidColorBrush 也使用属性 (Attribute) 语法设置了其 Color 属性 (Property)。 此 XAML 的呈现结果等同于前面使用属性语法设置 Fill 的 XAML 示例。)

<Rectangle Width="100" Height="100">
  <Rectangle.Fill>
    <SolidColorBrush Color="Blue"/>
  </Rectangle.Fill>
</Rectangle>

由于 Brush 类型转换器的原因,SolidColorBrush 成为唯一可针对新 Fill 值选择属性 (Property) 元素语法或属性 (Attribute) 语法(不使用标记扩展用法,如资源引用或绑定)的 Brush 案例。 对于可用于设置 Fill 的其他 Brush 类型,没有可用来创建该 Brush 类型的类型转换器行为。 因此,如果要使用 brush 类型(例如 ImageBrush)来设置 Fill,必须对 Fill 使用属性元素语法并将 ImageBrush 声明为对象元素以提供属性值,或者使用下一节中介绍的标记扩展。

<Rectangle Width="100" Height="100">
  <Rectangle.Fill>
    <ImageBrush ImageSource="forest.jpg"/>
  </Rectangle.Fill>
</Rectangle>

标记扩展是一个在 Silverlight XAML 实现中广泛使用的 XAML 语言概念。 在 XAML 属性语法中,花括号({}})表示标记扩展用法。 此用法指示 XAML 处理不要像通常那样将属性值视为文本字符串或者视为可直接转换为文本字符串的值。 相反,分析器通常应调用支持该特定标记扩展的代码,该标记扩展可帮助从标记中构造对象树。

Silverlight 支持在其默认的 Silverlight XAML 命名空间下定义且其 XAML 分析器可以理解的以下标记扩展。

Silverlight 还支持在 XAML 语言 XAML 命名空间中定义的一个非常简单的标记扩展,即 x:Null

采用引用类型值(类型没有转换器)的属性需要属性元素语法(该语法始终创建新实例)或通过标记扩展的对象引用。 Silverlight 标记扩展通常从应用程序的对象图的其它部分返回一个现有的实例,或延时一个值到运行时。 通过使用标记扩展,每个可使用 XAML 设置的属性 (Property) 都可能可在属性 (Attribute) 语法中设置。 即使属性 (Property) 不支持对直接对象实例化使用属性 (Attribute) 语法,也可以使用属性 (Attribute) 语法为属性 (Property) 提供引用值;或者可以使特定行为能够符合用值类型或实时创建的引用类型填充 XAML 属性 (Property) 这一常规要求。

例如,下面的 XAML 使用属性 (Attribute) 语法设置 BorderStyle 属性 (Property) 的值。 Style 属性 (Property) 采用了 Style 类的实例,这是默认情况下无法使用属性 (Attribute) 语法字符串创建的引用类型。 但在本例中,属性 (Attribute) 引用了特定的标记扩展 StaticResource 当处理该标记扩展时,它返回对以前在资源字典中定义为键控资源的某个样式的引用。

<Canvas.Resources>
  <Style TargetType="Border" x:Key="PageBackground">
    <Setter Property="BorderBrush" Value="Blue"/>
    <Setter Property="BorderThickness" Value="5"/>
  </Style>
</Canvas.Resources>
...
<Border Style="{StaticResource PageBackground}">
  ...
</Border>

有关标记扩展的参考列表,请参见 Silverlight 命名空间扩展XAML 命名空间 (x:) 语言功能 有关此处介绍的资源字典概念的详细信息,请参见资源字典

在许多情况下,可以使用标记扩展来提供一个作为对现有对象的引用的值,或者标记扩展可以提供一个可以以属性 (Attribute) 格式设置属性 (Property) 的对象。 有关更多信息,请参见 XAML 用法语法主题的“标记扩展”部分。

Silverlight 5 Beta 引入支持定义自定义标记扩展的基类。 有关更多信息,请参见 IMarkupExtension<T>

文本"{"值

因为左大括号符号 { 是标记扩展序列的开始标记,所以,您必须使用转义符序列,以便指定以 { 开头的文本字符值。 转义序列是 {} 例如,若要指定作为单个左大括号的字符值,请将属性值指定为 {}{ 您还可以在某些情况下使用替代引号(例如,"" 分隔的属性值内的 '),以便将 { 值作为字符串提供。

类型转换器是一个概念实体,它采用 XAML 中的一个属性值,并使用字符串值来创建实际不是字符串的结果值。 类型转换器与对象的后备类型关联,或有时与其特定属性关联。 访问类型转换期不要求 XAML 标记中的任何特殊用法。 XAML 处理器读取后备类型作为 XAML 处理器执行的一般类型映射行为的一部分,确定这些类型是否支持类型转换器,并在需要获取值时调用该类型转换器。

如前面“设置属性”部分所述,在可能需要属性语法的情况下,类型转换器启用属性语法。 通常,其目的是为了简化标记格式。 某些类型转换器的转换行为比较简单。 例如,NullableBoolConverter 支持将 Nullable<bool> 值的三个可能状态分别指定为字符串 truefalse{x:Null} 的功能。 在 Silverlight 参考文档中,类型转换器启用的 XAML 语法通常在后备 TypeConverter 类中找不到。 而是应在您可以在其中使用该类型转换器启用的语法的每个对象或属性的参考页上找到有关属性语法的详细信息。 通常,不需要在 Silverlight 中直接调用 TypeConverter 方法。

少数类型转换器支持一种非常复杂的“mini 语言”,这可能要求完全理解语法或语法指南。 一个示例是属性路径语法,它记载了与属性相关的语法,如使用 PropertyPathConverterPath

Silverlight 中的类型转换器主要作为 XAML 的支持类,并为任何编写类型转换器以支持自定义类型的类充当基类。

有关 XAML 的类型转换器的更多信息,包括如何定义自己的类型转换器以支持 XAML 的自定义类型,请参见 TypeConverter 和 XAML

注意 说明:

如果您正在使用 JavaScript API for Silverlight,则 XAML 中的事件处理将有所不同。 此处不讨论这些差异;请参见 Silverlight 的 JavaScript API 中的 XAML 和 XAML 相关概念

XAML 是用于对象及其属性的声明性语言,但它也可以包含用于将事件处理程序附加到标记中的对象的语法。 接着,可以通过特定的技术(如 Silverlight)扩展 XAML 事件语法约定,这会通过编程模型集成 XAML 声明的事件。 可以将相关事件的名称指定为处理该事件的对象的属性名称。 对于属性值,可以指定在代码中定义的事件处理程序函数的名称。 XAML 处理器使用此名称在加载的对象树中创建一个委托表示形式,并将指定的处理程序添加到内部处理程序列表中。

大多数基于 Silverlight 的应用程序都是由标记和代码隐藏源生成的。 在一个项目中,XAML 被编写为 .xaml 文件,而使用 CLR 语言(如 Visual Basic 或 C#)编写代码隐藏文件。 当 XAML 文件是标记 - 编译作为 Silverlight 项目创建操作的一部分时,通过将一个命名空间和类指定为 XAML 页的根元素的 x:Class 属性来确定每个 XAML 页的 XAML 代码隐藏文件的位置。

有关这些机制如何在 XAML 中发挥作用以及它们如何与 Silverlight 编程和应用程序模型相关的更多信息,请参见代码隐藏和分部类Silverlight 的事件概述

创建 ResourceDictionary 是一个常见任务,通常通过使用 XAML 创作所有资源字典来完成。 然而,资源字典及其使用方法是一个更大的概念领域,超出了本主题的范围。 有关更多信息,请参见 资源字典

XAML 语言在根本上基于 XML 语言。 按定义而言,任何有效的 XAML 文件都是有效的 XML 文件。 然而,XAML 大大扩展了 XML。 尤其是,由于它与后备类型概念的关系,它将以非常不同的方式处理架构的概念,并添加语言元素(如附加的成员和标记扩展)。 xml:lang 在 XAML 中有效,但它影响运行时而不影响分析行为,通常其别名为框架级别的属性。有关更多信息,请参见 FrameworkElement.Language xml:base 在标记中有效,但会被 Silverlight XAML 所忽略。 xml:space 是有效的,但只与 Whitespace Processing 部分中讨论的方案相关。 encoding 属性在 XAML 中是有效的。 仅支持 UTF-8 和 UTF-16 编码。 不支持 UTF-32。

XAML 中的区分大小写

XAML 是一种区分大小写的语言。 这是 XAML 基于 XML 的另一种体现,XAML 是区分大小写的。 XAML 元素和属性的名称区分大小写。 属性 (Attribute) 值可能区分大小写,这取决于如何针对特定属性 (Property) 处理属性 (Attribute) 值。 例如,如果属性值声明了枚举成员名称,则对成员名称字符串进行类型转换以返回枚举成员值的内置行为不区分大小写。 与之相反,Name 属性的值,以及用于根据 Name 属性声明的名称处理对象的实用工具方法,将名称字符串视为区分大小写。

在 Silverlight 3 中, Silverlight 使用不同的 XAML 分析器。 在 Silverlight 4 和更高版本的运行时中,两个分析器并行存在,这就为 XAML 分析提供了向后兼容。 XAML 格式中有一些特定的变体,每个 XAML 分析器都可以进行处理。

本主题介绍 Silverlight 中基于 Silverlight 5 Beta XAML 分析器行为和功能的 XAML。 有关 Silverlight 各个版本的 XAML 分析器之间的某些特定差异的详细信息,请参见 Silverlight 版本之间的 XAML 处理差异. 有关如何升级应用程序以解决 XAML 处理差异的信息,请参见 Silverlight 版本之间的 XAML 处理差异确保您的 Silverlight 应用程序能与 Silverlight 5 一起工作

在 Silverlight XAML 和 WPF XAML 间存在某些区别,这可能会影响迁移方案或使用 UI 共享设计的应用程序。 有关更多信息,请参见 Silverlight 版本和 WPF 之间的 XAML 处理差异

为了与 XML 保持一致,XAML 中的空白字符包括空格、换行符和制表符。 它们分别对应于 Unicode 值 0020、000A 和 0009。

默认情况下,当 XAML 处理器处理 XAML 文件中元素间的任意内部文本时,将发生下列空白规范化:

  • 移除东亚字符之间的换行符。 有关“东亚字符”的定义,请参见本主题后面的“东亚字符”一节。

  • 将所有空白字符(空格、换行符和制表符)转换为空格。

  • 删除所有连续的空格,将其替换为一个空格。

  • 删除紧跟在开始标记后面的一个空格。

  • 删除紧靠在结束标记前面的一个空格。

“Default”对应于 xml:space 属性的默认值所表示的状态。

内部文本中的空白和字符串基元

上面的规范化规则适用于 XAML 元素中的内部文本。 进行规范化后,XAML 处理器将所有内部文本转换为相应的类型,如下所示:

  • 如果属性的类型不是一个集合,而是一个间接的 Object 类型,XAML 处理器将尝试使用其类型转换器转换为该类型。 如果这里的转换失败,将导致 XAML 解析错误。

  • 如果属性的类型是一个集合,而且内部文本是连续的(没有介入的元素标记),则将内部文本分析为一个 String 如果集合类型不能接受 String,则也会导致 XAML 分析器错误。

  • 如果属性的类型是 Object,则将内部文本分析为一个 String 如果有介入的元素标记,则会导致 XAML 分析器错误,因为 Object 类型表示单个对象(String 等)。

  • 如果属性的类型是一个集合,而内部文本并不连续,则将第一个子字符串转换为一个 String 并添加为一个集合项,再将介入元素添加为一个集合项,最后将尾随子字符串(如果有)作为第三个 String 项添加到集合中。

空白和文本内容模型

在实际应用中,保留空白只涉及到所有可能的内容模型的一个子集。 该子集由一些内容模型组成,这些内容模型可以使用某种形式的单个 String 类型、专用的 String 集合,或者混合使用 String 与列表、集合或字典中的其他类型。

这些内容模型内的默认行为是不将保留的任何空白视为有意义,即使对于可以使用字符串的内容模型而言,也是如此。

有关通常将空白作为有意义字符处理的控件或其他类型的更多信息,请参见文本和字体RichTextBox 概述

保留空白

有几种方法可用于保留源 XAML 中的空白以实现最终表示形式,这些方法不受 XAML 处理器空白规范化的影响。

xml:space="preserve":在需要保留空白的元素级指定此特性。 请注意,这样将保留所有空白,包括代码编辑应用程序为了以视觉上直观的嵌套形式对齐标记元素而添加的空格,但是否呈现这些空白仍然是包含元素的内容模型的问题。 不建议在根级别指定 xml:space="preserve",因为大多数对象模型不会以任何方式将空白视为有意义。 更好的做法是:专门在可呈现字符串中空白的元素级别或者在空白有意义的集合的元素级别设置该属性。

实体和不间断空格:XAML 支持在文本对象模型中放置任何 Unicode 实体。 您可以使用专用的实体,如不间断空格(在 UTF-8 编码中为 &#160;)。 还可以使用支持不间断空格字符的多格式文本控件。 使用实体模拟布局特征(如缩进)时应谨慎,因为实体的运行时输出会由于许多因素而不同,而影响实体输出的因素(如正确使用面板和边距)要多于一般的布局工具。

东亚字符

“东亚字符”是指一组 Unicode 字符,范围从 U+20000 到 U+2FFFD 以及 U+30000 到 U+3FFFD。 这个子集有时也称为“CJK 表意文字”。 有关更多信息,请参见 http://www.unicode.org。

Silverlight 3 空白

如果您针对的是 Silverlight 3,Silverlight 3 的 XAML 处理使用不同的空白处理规则。 有关更多信息,请参见 Silverlight 版本之间的 XAML 处理差异

由于 XAML 是一种标记语言,用于调试在 Visual Studio 中调试的某些典型策略是不可用的。 有关更多信息,请参见 调试 Silverlight XAML

社区附加资源

添加
Microsoft 正在进行一项网上调查,以了解您对 MSDN 网站的意见。 如果您选择参加,我们将会在您离开 MSDN 网站时向您显示该网上调查。

是否要参加?
显示:
© 2014 Microsoft