XAML 语法指南

我们介绍 XAML 语法规则和描述可用于 XAML 语法的限制或选项的术语。 如果你不熟悉使用 XAML 语言,你希望对术语或语法部分进行刷新,或者你对 XAML 语言的工作原理以及想要更多背景和上下文感到好奇,你将发现本主题非常有用。

XAML 为 XML

可扩展应用程序标记语言(XAML)具有基于 XML 的基本语法,根据定义,有效的 XAML 必须是有效的 XML。 但 XAML 也有其自己的语法概念来扩展 XML。 给定的 XML 实体在纯 XML 中可能有效,但该语法可能具有与 XAML 不同的、更完整的含义。 本主题介绍这些 XAML 语法概念。

XAML 词汇

XAML 与大多数 XML 用法不同的一个区域是,XAML 通常不是使用架构(例如 XSD 文件)强制执行的。 这是因为 XAML 旨在可扩展,这就是首字母缩略词 XAML 中“X”的含义。 分析 XAML 后,在 XAML 中引用的元素和属性应存在于某些后备代码表示形式中,无论是在 Windows 运行时定义的核心类型中,还是在扩展或基于 Windows 运行时的类型中。 SDK 文档有时是指已内置于 Windows 运行时的类型,并且可以在 XAML 中用作 Windows 运行时的 XAML 词汇 。 Microsoft Visual Studio 可帮助你生成在此 XAML 词汇中有效的标记。 只要项目中正确引用了这些类型的源,Visual Studio 还可以包含 XAML 使用的自定义类型。 有关 XAML 和自定义类型的详细信息,请参阅 XAML 命名空间和命名空间映射

声明对象

程序员通常以对象和成员的形式思考,而标记语言则概念化为元素和属性。 从最基本层面来说,在 XAML 标记中声明的元素会在运行时对象表示中成为一个对象。 若要为应用创建运行时对象,请在 XAML 标记中声明 XAML 元素。 当 Windows 运行时加载 XAML 时,将创建该对象。

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

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

  • 直接使用对象元素语法: 这使用开始标记和结束标记将对象实例化为 XML 格式元素。 可以使用此语法声明根对象或创建设置属性值的嵌套对象。
  • 间接使用属性语法: 这使用内联字符串值,其中包含有关如何创建对象的说明。 XAML 分析程序使用此字符串将属性的值设置为新创建的引用值。 对它的支持仅限于某些常见对象和属性。
  • 使用标记扩展。

这并不意味着你始终可以选择在 XAML 词汇中创建对象的任何语法。 某些对象只能使用对象元素语法创建。 某些对象只能通过最初在属性中设置来创建。 事实上,可以使用对象元素或属性语法创建的对象在 XAML 词汇中相对罕见。 即使这两种语法形式都可行,其中一种语法在样式方面也更为常见。 还可以在 XAML 中使用技术来引用现有对象,而不是创建新值。 现有对象可以在 XAML 的其他区域中定义,或者可能通过平台及其应用程序或编程模型的一些行为隐式存在。

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

若要使用对象元素语法声明对象,请编写如下标记: <objectName> </objectName>,其中 objectName 是要实例化的对象的类型名称。 下面是声明 Canvas 对象的对象元素用法:

<Canvas>
</Canvas>

如果对象不包含其他对象,则可以使用一个自闭合标记而不是左/右对来声明对象元素:<Canvas />

容器

许多用作 UI 元素的对象(如 Canvas)可以包含其他对象。 这些有时称为容器。 下面的示例展示了一个包含一个元素 RectangleCanvas 容器。

<Canvas>
  <Rectangle />
</Canvas>

使用属性语法声明对象

由于此行为与属性设置相关,我们将在后续部分中讨论这一点。

初始化文本

对于某些对象,可以使用用作构造的初始化值的内部文本来声明新值。 在 XAML 中,此技术和语法称为 初始化文本。 从概念上讲,初始化文本类似于调用具有参数的构造函数。 初始化文本可用于设置某些结构的初始值。

如果需要具有 x:Key 的结构值,则通常使用对象元素语法和初始化文本,以便它可以存在于 ResourceDictionary 中。 如果在多个目标属性之间共享该结构值,则可以执行此作。 对于某些结构,不能使用属性语法设置结构的值:初始化文本是生成有用且可共享 的 CornerRadiusThicknessGridLengthColor 资源的唯一方法。

此缩写示例使用初始化文本来指定 粗细的值,在本例中指定将 LeftRight 设置为 20 的值, 以及顶部底部 都设置为 10 的值。 本示例显示 Thickness 被创建为一个键化资源,然后显示对该资源的引用。 有关 粗细 初始化文本的详细信息,请参阅 “粗细”。

<UserControl ...>
  <UserControl.Resources>
    <Thickness x:Key="TwentyTenThickness">20,10</Thickness>
    ....
  </UserControl.Resources>
  ...
  <Grid Margin="{StaticResource TwentyTenThickness}">
  ...
  </Grid>
</UserControl ...>

注释

某些结构不能声明为对象元素。 不支持初始化文本,它们不能用作资源。 必须使用属性语法才能在 XAML 中将属性设置为这些值。 这些类型包括: DurationRepeatBehaviorPointRectSize

设置属性

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

  • 通过使用属性语法。
  • 通过使用属性元素语法。
  • 通过使用元素语法,内容(内部文本或子元素)正在设置对象的 XAML 内容属性。
  • 通过使用集合语法(通常是隐式集合语法)。

与对象声明一样,此列表并不意味着可以使用每个技术设置任何属性。 某些属性仅支持其中一种技术。 某些属性支持多种形式;例如,有一些属性可以使用属性元素语法或特性语法。 可能的情况取决于属性和属性使用的对象类型。 在 Windows 运行时 API 参考中,你将看到可在 “语法 ”部分使用的 XAML 用法。 有时会有一种替代用法能够正常工作,但会更加冗长。 这些详细用法并不总是显示,因为我们试图向你展示在 XAML 中使用该属性的最佳做法或实际方案。 可在 XAML 中设置属性的参考页面中,XAML 用法 部分提供了 XAML 语法指南。

不能以任何方式在 XAML 中设置对象的某些属性,并且只能使用代码进行设置。 通常,这些属性更适合在后台代码中使用,而不是在 XAML 中使用。

无法在 XAML 中设置只读属性。 即使在代码中,所拥有的类型也必须支持设置的其他方式,例如构造函数重载、帮助方法,或者计算属性的支持。 计算属性依赖于其他可设置属性的值,有时还依赖于具有内置处理的事件;这些功能在依赖属性系统中可用。 有关依赖属性如何对计算属性支持有用的详细信息,请参阅 依赖属性概述

在 XAML 中,集合语法看起来像是在设置一个只读属性,但实际上不是。 请参阅本主题后面的“集合语法”。

使用属性语法设置属性

设置属性值是使用标记语言(例如 XML 或 HTML)设置属性值的典型方法。 设置 XAML 属性类似于在 XML 中设置属性值的方式。 属性名称可以在元素名称之后的标记中的任意位置指定,并且至少用一个空格与元素名称分隔。 属性名称后跟等号。 属性值包含在一对引号中。 引号可以是双引号或单引号,只要它们匹配并括住值即可。 属性值本身必须以字符串的形式表达。 字符串通常包含数字,但到 XAML,所有属性值都是字符串值,直到 XAML 分析程序涉及并执行一些基本值转换。

此示例使用四个属性的属性语法来设置 Rectangle 对象的 NameWidthHeightFill 属性。

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

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

可以使用属性元素语法设置对象的许多属性。 属性元素如下所示: <对象.属性>

若要使用属性元素语法,请为要设置的属性创建 XAML 属性元素。 在标准 XML 中,此元素只被视为名称中包含点的元素。 但是,在 XAML 中,元素名称中的点将元素标识为属性元素, 属性 应是支持对象模型实现中的 对象 成员。 若要使用属性元素语法,必须能够指定对象元素才能“填充”属性元素标记。 属性元素总是包含一些内容(单个元素、多个元素或内部文本);没有必要使用自闭合的属性元素。

在以下语法中, 属性 是要设置的属性的名称, propertyValueAsObjectElement 是单个对象元素,应满足属性的值类型要求。

< 对象>

< 对象.财产>

propertyValueAsObjectElement

</ 对象.财产>

</ 对象>

以下示例使用属性元素语法,将矩形填充设置为SolidColorBrush对象元素。 (在 SolidColorBrush 中, Color 设置为属性。此 XAML 分析的结果与上一个使用属性语法设置 Fill 的 XAML 示例相同。

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

XAML 词汇和面向对象的编程

属性和事件作为 Windows 运行时 XAML 类的 XAML 成员出现时,通常从基类继承。 请考虑以下示例: <Button Background="Blue" .../>. Background 属性不是 Button 类上立即声明的属性。 相反, Background 继承自基 Control 类。 事实上,如果查看 Button 的参考主题,你将看到成员列表包含至少一个继承成员,其中包含每个连续基类链中的一个继承成员: ButtonBaseControlFrameworkElementUIElementDependencyObject。 在 “属性” 列表中,所有读写属性和集合属性都是在 XAML 词汇意义上继承的。 事件(如各种 UIElement 事件)也是可继承的。

如果使用 Windows 运行时引用进行 XAML 指南,则语法中甚至示例代码中显示的元素名称有时适用于最初定义该属性的类型,因为该引用主题由继承自基类的所有可能类型共享。 如果在 XML 编辑器中使用 Visual Studio 的 IntelliSense for XAML,IntelliSense 及其下拉列表可以更好地合并继承,并提供一个准确的属性列表,这些属性可在类实例的对象元素启动后进行设置。

XAML 内容属性

某些类型定义其属性之一,以便该属性启用 XAML 内容语法。 对于类型的 XAML 内容属性,可以在 XAML 中指定该属性时省略该属性的属性元素。 或者,可以通过直接在拥有类型的对象元素标记中提供该内部文本,将属性设置为内部文本值。 XAML 内容属性支持该属性的直接标记语法,并通过减少嵌套使 XAML 更具可读性。

如果 XAML 内容语法可用,该语法将显示在 Windows 运行时参考文档中该 属性的“ XAML”部分中。 例如,BorderChild 属性页显示 XAML 内容语法,而不是属性元素语法来设置 Border 的单对象 Border.Child 值,如下所示:

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

如果声明为 XAML 内容属性的属性是 Object 类型或类型 String,则 XAML 内容语法支持 XML 文档模型中基本内部文本的内容:开始对象标记和结束对象标记之间的字符串。 例如,TextBlockText 属性页显示 XAML 内容语法,其中设置了内部文本值为 Text,但字符串“Text”在标记中始终不会出现。 下面是一个示例用法:

<TextBlock>Hello!</TextBlock>

如果一个类具有 XAML 内容属性,这会在该类的引用主题中的“属性”部分进行说明。 查找 ContentPropertyAttribute 的值。 此属性使用名为“Name”的字段。 “Name”的值是该类的属性名称,该属性是 XAML 内容属性。 例如,在 “边框 参考页”上,你将看到以下内容:ContentProperty(“Name=Child”)。

我们应提及的一个重要 XAML 语法规则是,不能混合 XAML 内容属性和在元素上设置的其他属性元素。 XAML 内容属性必须完全设置在任何属性元素之前或之后。 例如,这是无效的 XAML:

<StackPanel>
  <Button>This example</Button>
  <StackPanel.Resources>
    <SolidColorBrush x:Key="BlueBrush" Color="Blue"/>
  </StackPanel.Resources>
  <Button>... is illegal XAML</Button>
</StackPanel>

集合语法

到目前为止显示的所有语法都是将属性设置为单个对象。 但许多 UI 方案要求给定的父元素可以具有多个子元素。 例如,输入窗体的 UI 需要多个文本框元素、某些标签和“提交”按钮。 不过,如果要使用编程对象模型访问这些多个元素,它们通常是单个集合属性中的项,而不是每个项都是不同属性的值。 XAML 支持多个子元素,并支持典型的支持集合模型,方法是将使用集合类型的属性视为隐式属性,并为集合类型的任何子元素执行特殊处理。

许多集合属性也标识为类的 XAML 内容属性。 隐式集合处理和 XAML 内容语法的组合经常出现在用于控件组合的类型(如面板、视图或项控件)中。 例如,以下示例演示了在 StackPanel 中组合两个对等 UI 元素的最简单 XAML。

<StackPanel>
  <TextBlock>Hello</TextBlock>
  <TextBlock>World</TextBlock>
</StackPanel>

XAML 集合语法的机制

起初,XAML 可能看起来像是允许对只读集合属性进行“设置”。 实际上,XAML 支持的内容是向现有集合添加项。 实现 XAML 支持的 XAML 语言和 XAML 处理器依赖于支持集合类型的约定来启用此语法。 通常有一个后盾属性,例如索引器或 Items 属性,该属性引用集合的特定项。 通常,该属性在 XAML 语法中不显式。 对于集合,XAML 分析的基础机制不是一个属性,而是一个方法:具体而言,在大多数情况下是 Add 方法。 当 XAML 处理器在 XAML 集合语法中遇到一个或多个对象元素时,首先从元素创建每个此类对象,然后通过调用集合的 Add 方法向包含集合添加每个新对象。

当 XAML 分析器将项添加到集合时,它是 Add 方法的逻辑,用于确定给定 XAML 元素是否是集合对象的允许项子项。 许多集合类型都由后盾实现强类型化,这意味着 Add 的输入参数需要传递的任何内容都必须与 Add 参数类型匹配。

对于集合属性,当您尝试将集合显式定义为对象元素时,请务必小心。 每当遇到对象元素时,XAML 分析器都会创建一个新对象。 如果尝试使用的集合属性是只读的,则可能会引发 XAML 分析异常。 只需使用隐式集合语法,就不会看到该异常。

何时使用属性或属性元素语法

支持在 XAML 中设置的所有属性都支持通过特性或属性元素语法直接设定值,但可能无法互换支持这两种语法。 某些属性支持任一语法,某些属性支持其他语法选项,例如 XAML 内容属性。 属性支持的 XAML 语法的类型取决于属性用作其属性类型的对象类型。 如果属性类型是基元类型,例如 double(float 或 decimal)、整数、布尔值或字符串,则属性始终支持属性语法。

如果用于设置该属性的对象类型可以通过处理字符串来创建该属性,还可以使用属性语法设置属性。 对于原始类型,这种情况始终存在,类型转换是内置到分析器中的。 但是,也可以使用指定为属性值的字符串而不是属性元素中的对象元素来创建某些其他对象类型。 为此,必须有基础类型转换,这可以由特定属性支持,也可以通常用于支持使用该属性类型的所有值。 特性的字符串值用于设置对新对象值初始化非常重要的属性。 可能,特定类型转换器还可以创建公共属性类型的不同子类,具体取决于它如何唯一地处理字符串中的信息。 支持此行为的对象类型将具有参考文档的语法部分中列出的特殊语法。 例如,Brush 的 XAML 语法演示如何使用属性语法为任何类型 Brush 的属性创建新的 SolidColorBrush 值(Windows 运行时 XAML 中有许多 Brush 属性)。

XAML 分析逻辑和规则

有时,以类似于 XAML 解析器读取 XAML 的方式来读取信息会很有益:把它视为一组按线性顺序读取的字符串标记。 XAML 分析程序必须在 XAML 工作方式定义的一组规则下解释这些令牌。

设置属性值是使用标记语言(例如 XML 或 HTML)设置属性值的典型方法。 在以下语法中, objectName 是要实例化的对象, propertyName 是要在该对象上设置的属性的名称, propertyValue 是要设置的值。

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

-or-

<objectName propertyName="propertyValue">

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

</objectName>

任一语法都允许声明对象并设置该对象的属性。 尽管第一个示例是标记中的单个元素,但此处实际上有关于 XAML 处理器如何分析此标记的步骤。

首先,对象元素的存在指示必须实例化新的 objectName 对象。 只有在实例存在之后,才能在实例上设置实例属性propertyName

XAML 的另一个规则是,元素的属性必须能够按任意顺序进行设置。 例如,<Rectangle Height="50" Width="100" /><Rectangle Width="100" Height="50" />之间没有区别。 使用什么顺序是个人风格的问题。

注释

如果你使用除 XML 编辑器以外的设计图面,XAML 设计器通常会提升排序约定,但稍后可以自由编辑该 XAML,以重新排序属性或引入新属性。

附加属性

XAML 通过添加称为 附加属性的语法元素来扩展 XML。 与属性元素语法类似,附加属性语法包含一个点,并且该点对 XAML 分析具有特殊意义。 具体而言,该点分隔附加属性的提供者和属性名称。

在 XAML 中,使用语法 AttachedPropertyProvider 设置附加属性。PropertyName 下面是有关如何在 XAML 中设置附加属性 Canvas.Left 的示例:

<Canvas>
  <Button Canvas.Left="50">Hello</Button>
</Canvas>

可以在后盾类型中没有该名称的属性的元素上设置附加属性,这样它们的作用就有点像全局属性,或者由其他 XML 命名空间(如 xml:space 属性)定义的属性。

在 Windows 运行时 XAML 中,你将看到支持以下方案的附加属性:

有关详细信息,请参阅 附加属性概述

文本“{”值

由于左大括号符号 { 是标记扩展序列的开始,因此使用转义序列来指定以“{”开头的字符串。 转义序列为“{}”。 例如,若要指定一个由单个左大括号组成的字符串值,请将属性值指定为“{}{”。 还可以使用备用引号(例如,由“”分隔的属性值中的')提供“{”值作为字符串。

注释

如果“\}”位于带引号的属性内,则“\}”也有效。  

枚举值

Windows 运行时 API 中的许多属性使用枚举作为值。 如果成员是读写属性,则可以通过提供属性值来设置此类属性。 通过使用常量名称的非限定名称来标识要用作属性值的枚举值。 例如,下面介绍如何在 XAML 中设置 UIElement.Visibility<Button Visibility="Visible"/>。 此处的“Visible”作为字符串直接映射到 Visibility 枚举的命名常量 Visible

  • 不要使用限定的表单,它不起作用。 例如,这是无效的 XAML: <Button Visibility="Visibility.Visible"/>
  • 不要使用常量的值。 换句话说,不要依赖于显式或隐式存在枚举的整数值,具体取决于枚举的定义方式。 尽管它似乎可以正常工作,但在 XAML 或代码中,这是一种不良做法,因为你依赖于可能是临时实现细节的内容。 例如,不要这样做:<Button Visibility="1"/>

注释

在使用 XAML 和使用枚举的 API 的参考主题中,单击语法的“属性值”部分中的枚举类型的链接。 此链接指向枚举页,可在其中发现该枚举的命名常量。

枚举可以是标志位的,这意味着它们加上了FlagsAttribute属性。 如果需要将标志枚举的多个值指定为 XAML 属性值,请使用每个枚举常量的名称,各名称之间以逗号(,)分隔,且中间不加空格。 标志属性在 Windows 运行时 XAML 词汇中并不常见,但 ManipulationModes 是一个示例,其中支持在 XAML 中设置有标志枚举值。

XAML 中的接口

在极少数情况下,你将看到一个 XAML 语法,其中属性的类型是接口。 在 XAML 类型系统中,实现该接口的类型在分析时可作为值接受。 必须有一个创建的此类类型实例可用于作为值。 你将在 XAML 语法中看到一个用作 CommandCommandParameter 类型的接口,这些属性属于 ButtonBase。 这些属性支持模型-视图-视图模型(MVVM)设计模式,其中 ICommand 接口是视图和模型交互方式的协定。

Windows 运行时参考中的 XAML 占位符约定

如果你已经检查了 Windows 运行时 API 的参考主题的任意 语法 部分,这些主题可以使用 XAML,你可能已经看到语法包含相当多的占位符。 XAML 语法不同于 C#、Microsoft Visual Basic 或 Visual C++ 组件扩展(C++/CX)语法,因为 XAML 语法是用法语法。 它提示你最终在自己的 XAML 文件中的用法,但不对可以使用的值进行过度规范化。 因此,用法通常描述混合文本和占位符的语法类型,并在 XAML 值 部分定义一些占位符。

在属性的 XAML 语法中看到类型名称/元素名称时,显示的名称是最初定义该属性的类型的名称。 但 Windows 运行时 XAML 支持基于 DependencyObject 的类的类继承模型。 因此,通常可以在一个类上使用某个特性,该类并非最初定义该属性/特性的类,而是从最初定义该属性/特性的类派生而来的。 例如,可以使用深层继承将 Visibility 设置为任何 UIElement 派生类的属性。 例如: <Button Visibility="Visible" />。 因此,不要过于字面化地理解任何 XAML 用法语法中显示的元素名称;对于表示该类的元素以及表示派生类的元素,该语法可能都是可行的。 如果显示为定义元素的类型很少或不可能出现在实际用法中,该类型名称在语法中故意小写。 例如,针对 UIElement.Visibility 看到的语法为:

<uiElement Visibility="Visible"/>
-or-
<uiElement Visibility="Collapsed"/>

许多 XAML 语法节包括“用法”中的占位符,这些占位符随后在“语法”部分下的 XAML 值部分定义。

XAML 用法部分还使用各种通用占位符。 每次在 XAML 值中都不会重新定义这些占位符,因为你会猜测或最终了解它们所代表的内容。 我们认为大多数读者会厌倦在 XAML 值 中再次看到它们,因此我们将其排除在定义外。 有关参考,下面是其中一些占位符的列表,以及它们在一般意义上的含义:

  • object:从理论上讲,任何对象值,但通常仅限于某些类型的对象,如字符串或对象选择,应检查参考页上的“备注”了解详细信息。
  • 对象属性对象属性的组合用于特定情况下,其中显示的语法为可作为多种属性的属性值的类型。 例如,画笔显示的 Xaml 属性用法 包括:<objectproperty=“predefinedColorName”/>
  • eventhandler:此值会出现在为事件属性提供的每个 XAML 语法示例中。 此处提供的是事件处理程序函数的函数名称。 必须在 XAML 页面的代码后置文件中定义该函数。 在编程级别,该函数必须与要处理的事件的委托签名匹配,否则应用代码不会编译。 但是,这确实是一个编程注意事项,而不是 XAML 注意事项,因此我们不会尝试在 XAML 语法中暗示有关委托类型的任何内容。 如果想要知道应为事件实现哪个委托,该委托位于事件引用主题的 “事件信息 ”部分,位于标记为 “委托”的表行中。
  • enumMemberName:显示在所有枚举的属性语法中。 使用枚举值的属性有类似的占位符,通常会在占位符前加上枚举名称的提示。 例如, FrameworkElement.FlowDirection 所示的语法为 <frameworkElementFlowDirection=“flowDirectionMemberName”/>。 如果位于其中一个属性引用页中,请单击文本 Type:旁边的“属性值”部分中显示的枚举类型的链接。 对于使用该枚举的属性的属性值,可以使用“成员”列表的“成员”列中列出的任何字符串。
  • doubleintstringbool:这些是 XAML 语言已知的基元类型。 如果使用 C# 或 Visual Basic 进行编程,则这些类型将投影为Microsoft .NET 等效类型,例如 DoubleInt32StringBoolean,在处理 .NET 代码隐藏中的 XAML 定义值时,可以在这些 .NET 类型上使用任何成员。 如果使用 C++/CX 进行编程,将使用C++基元类型,但也可以考虑这些等效于 平台 命名空间定义的类型,例如 Platform::String。 某些特定属性有时会有额外的值限制。 但通常会在 “属性值 ”部分或“备注”部分看到这些说明,而不是在 XAML 部分中,因为任何此类限制都适用于代码用法和 XAML 用法。

提示与技巧及样式说明

  • 一般情况下,标记扩展在 XAML 主概述中介绍。 但影响本主题中提供的指南的标记扩展是 StaticResource 标记扩展(和相关 ThemeResource)。 StaticResource 标记扩展的函数是允许将 XAML 分解为来自 XAML ResourceDictionary 的可重用资源。 几乎总是在 ResourceDictionary 中定义控件模板和相关样式。 通常你还可以在 ResourceDictionary 中定义控件模板定义或应用特定样式的小部分,例如用于应用对 UI 中多个部分重复使用的颜色的 SolidColorBrush。 通过使用 StaticResource,任何本需通过属性元素方式设置的属性,现在都可以通过属性语法进行设置。 但是,将 XAML 分解为重用的好处不仅仅是简化页面级语法。 有关详细信息,请参阅 ResourceDictionary 和 XAML 资源引用
  • 你将看到一些不同的约定,说明如何在 XAML 示例中应用空格和换行符。 特别是,对于如何拆分设置许多不同的属性的对象元素,有不同的约定。 这只是风格问题。 编辑 XAML 时,Visual Studio XML 编辑器会应用一些默认样式规则,但你可以在设置中更改这些规则。 少数情况下,XAML 文件中的空白被视为重要内容;有关详细信息,请参阅 XAML 和空格