唯一标识对象元素以便通过后台代码或常规代码访问已实例化的对象。 应用于后备编程模型后,可以将 x:Name 视为与持有对象引用的变量等效,由构造函数返回。
XAML 属性用法
<object x:Name="XAMLNameValue".../>
XAML 值
| 术语 | Description |
|---|---|
| XAMLNameValue | 符合 XamlName 语法限制的字符串。 |
XamlName 语法
下面是此 XAML 实现中用作键的字符串的规范语法:
XamlName ::= NameStartChar (NameChar)*
NameStartChar ::= LetterCharacter | '_'
NameChar ::= NameStartChar | DecimalDigit
LetterCharacter ::= ('a'-'z') | ('A'-'Z')
DecimalDigit ::= '0'-'9'
CombiningCharacter::= none
- 字符限制为较低的 ASCII 范围,更具体地说是罗马字母大写和小写字母、数字和下划线 (_) 字符。
- 不支持 Unicode 字符范围。
- 名称不能以数字开头。 如果用户提供数字作为初始字符,或者工具会根据包含数字的其他值自动生成 x:Name 值,则某些工具实现将下划线 (_) 追加到字符串。
注解
指定的 x:Name 将成为在处理 XAML 时在基础代码中创建的字段的名称,并且该字段包含对对象的引用。 字段的创建过程由 MSBuild 目标执行,这些目标还负责合并 XAML 文件的分部类及其后台代码。 此行为不一定指定 XAML 语言;它是适用于 XAML 的通用 Windows 平台 (UWP) 编程应用于在其编程和应用程序模型中使用 x:Name 的特定实现。
每个定义的 x:Name 在 XAML 名称范围中必须是唯一的。 通常,XAML 名称范围在加载页面的根元素级别定义,并包含单个 XAML 页面中该元素下的所有元素。 其他 XAML 名称范围由在该页上定义的任何控件模板或数据模板定义。 在运行时,将为从应用的控件模板创建的对象树的根节点创建另一个 XAML 名称范围,也为通过调用 XamlReader.Load 创建的对象树创建名称范围。 有关详细信息,请参阅 XAML 名称范围。
设计工具通常会在元素引入设计图面时自动生成 元素的 x:Name 值。 自动生成方案因所使用的设计器而异,但典型的方案是生成以支持元素的类名开头的字符串,后跟一个不断增加的整数。 例如,如果将第一个 Button 元素引入设计器,你可能会看到,在 XAML 中,此元素具有“Button1”的 x:Name 属性值。
不能在 XAML 属性元素语法或使用 SetValue 的代码中设置 x:Name。 x:Name 只能对元素使用 XAML 属性语法进行设置。
注释
具体而言,对于 C++/CX 应用,不会为 XAML 文件或页面的根元素创建 x:Name 引用的后备字段。 如果需要从 C++ 后台代码引用根对象,请使用其他 API 或树遍历。 例如,可以为已知的命名子元素调用 FindName ,然后调用 Parent。
x:Name 和其他 Name 属性
XAML 中使用的某些类型还具有名为 Name 的属性。 例如, FrameworkElement.Name 和 TextElement.Name。
如果 Name 作为元素的可设置属性 提供,则 Name 和 x:Name 可以在 XAML 中互换使用,但如果在同一元素上指定了这两个属性,则会出现错误。 也有一些情况下有 Name 属性,但它是只读的(如 VisualState.Name)。 如果是这种情况,那么就要始终使用 x:Name 为 XAML 中的元素命名,而只读 Name 用于某些不常见的代码场景。
请注意,通常不应将 FrameworkElement.Name 用作更改最初由 x:Name 设置的值的一种方式,尽管有一些情况是该常规规则的例外。 在典型场景中,XAML 名称范围的创建和定义是由 XAML 处理器执行的操作。 在运行时修改 FrameworkElement.Name 可能会导致 XAML 名称空间与私有字段命名对齐不一致,这将在后台代码中难以跟踪。
x:Name 和 x:Key
可以将 x:Name 作为属性应用于 ResourceDictionary 中的元素,以充当 x:Key 属性的替代项。 ( ResourceDictionary 中的所有元素都必须具有 x:Key 或 x:Name 属性的规则。对于 情节提要动画,这很常见。 有关详细信息,请参阅 ResourceDictionary 和 XAML 资源引用部分。