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)可以包含其他对象。 这些有时称为容器。 下面的示例演示包含一个元素(一个 Rectangle)的 Canvas 容器。

<Canvas>
  <Rectangle />
</Canvas>

使用属性语法声明对象

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

初始化文本

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

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

此缩写示例使用初始化文本来指定粗细的值,在本例中指定将 Left 和 Right 设置为 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 中,元素名称中的这个点将该元素标识为属性元素,property 应该是支持对象模型实现中的 object 的一个成员。 若要使用属性元素语法,必须能够指定对象元素才能“填充”属性元素标记。 属性元素将始终包含一些内容(单个元素、多个元素或内部文本):没有自结束属性元素的点。

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

<object>

<object.property>

propertyValueAsObjectElement

</object.property>

</object>

以下示例使用属性元素语法设置包含 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 的参考主题,你将看到成员列表包含至少一个继承成员,其中包含每个连续基类链中的一个继承成员:ButtonBase、ControlFrameworkElement、UIElementDependencyObject。“属性” 列表中,所有读写属性和集合属性都是在 XAML 词汇意义上继承的。 事件(如各种 UIElement 事件)也继承。

如果对 XAML 指南使用Windows 运行时引用,则语法中甚至示例代码中显示的元素名称有时是最初定义该属性的类型,因为该引用主题由继承自基类的所有可能类型共享。 如果在 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 属性页显示具有设置 Text 的内部文本值的 XAML 内容语法,但字符串“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 分析程序必须在 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 类型系统中,实现该接口的类型在分析时可作为值接受。 必须有一个可用于用作值的此类类型的创建实例。 你将看到一个接口,该接口用作 ButtonBase 的 Command CommandParameter 属性的 XAML 语法中的类型。 这些属性支持 Model-View-ViewModel (MVVM) 设计模式,其中 ICommand 接口是视图和模型交互方式的协定。

Windows 运行时引用中的 XAML 占位符约定

如果已检查了有关可以使用 XAML 的 Windows 运行时 API 的参考主题的任何语法部分,则可能已看到语法包含相当多的占位符。 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 属性用法包括:<object property=“predefinedColorName”/>
  • eventhandler:这显示为事件属性显示的每个 XAML 语法的属性值。 此处提供的是事件处理程序函数的函数名称。 必须在 XAML 页面的代码隐藏中定义该函数。 在编程级别,该函数必须与要处理的事件的委托签名匹配,否则应用代码不会编译。 但是,这确实是一个编程注意事项,而不是 XAML 注意事项,因此我们不会尝试在 XAML 语法中暗示有关委托类型的任何内容。 如果想要知道应为事件实现哪个委托,该委托位于事件引用主题的“事件信息”部分,位于标记为“委托的表行中。
  • enumMemberName:显示在所有枚举的属性语法中。 使用枚举值的属性有类似的占位符,但它通常为占位符加上枚举名称提示的前缀。 例如,为 FrameworkElement.FlowDirection 显示的语法为 <frameworkElementFlowDirection="flowDirectionMemberName"/>。 如果位于其中一个属性引用页中,请单击文本 Type:旁边的“属性值”部分中显示的枚举类型的链接。 对于使用该枚举的属性的属性值,可以使用“成员”列表的“成员”列中列出的任何字符串。
  • doubleintstringbool:这些是 XAML 语言已知的基元类型。 如果要使用 C# 或 Visual Basic 进行编程,则这些类型将投影到 Microsoft .NET 等效类型,例如 DoubleInt32String Boolean,在处理 .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 和空格