XAML 名称范围 (x:) 语言特性

本节介绍为 Windows 运行时实现的 XAML 语言特性的参考信息。

本部分内容

主题描述

x:Class 属性

配置 XAML 编译,在标记和代码隐藏之间连接分部类。代码分部类在一个独立的代码文件中定义,标记分部类由代码生成过程在 XAML 编译期间创建。

x:FieldModifier 属性

修改 XAML 编译行为,使指定对象引用的字段被定义有 public 访问权限而不是默认的 private 行为。

x:Key 属性

唯一标识作为资源被创建和引用的元素,这些资源存在于一个 ResourceDictionary 中。

x:Name 属性

唯一标识对象元素,可方便从代码隐藏或一般代码中访问已实例化的对象。应用于支持的编程模型之后,x:Name 可视为等效于持有一个对象引用(由一个构造函数返回)的变量。

x:Null 标记扩展

指定 null 作为通过一个 XAML 属性设置的属性的值。

x:Uid 指令

为标记元素提供一个唯一标识符。对于 Windows 运行时 XAML,这个唯一标识符供 XAML 本地化过程和工具使用(例如,使用 .resw 资源文件中的资源)。

XAML 固有数据类型

列出用于 Windows 运行时的 XAML 中对公共语言运行时 (CLR) 或 C++ 等其他编程语言中某些数据类型的语言级支持。

x:Class 属性

配置 XAML 编译,在标记和代码隐藏之间连接分部类。代码分部类在一个独立的代码文件中定义,标记分部类由代码生成过程在 XAML 编译期间创建。

XAML 属性使用方法

<object x:Class="namespace.classname"...>
  ...
</object>

XAML 值

术语描述

命名空间

可选。指定一个包含 classname 所标识的分部类的命名空间。如果指定 namespace,则一个点 (.)会将namespace 和 classname 分开。如果省略 namespace,会假设 classname 没有命名空间。

classname

必需。指定分部类的名称,该分部类连接已加载的 XAML 和该 XAML 的代码隐藏。

备注

x:Class 可声明为作为一个 XAML 文件/对象树的根并由生成操作编译的任何元素的属性,或者已编译应用程序的应用程序定义中 Application 根的属性。在页面根或应用程序根以外的任何元素上,以及在不会使用“页面” 生成操作编译 XAML 文件的任何环境中声明 x:Class,会导致编译时错误。

用作 x:Class 的类不能是嵌套类。

x:Class 属性的值必须是一个字符串,用于指定一个类的完全限定名称。只要构造代码隐藏时省略了命名空间信息(类定义从类级别开始),你可以省略命名空间信息。一个页面或应用程序定义的代码隐藏文件必须在一个代码文件中,并且该代码文件包含在项目中。代码隐藏类必须是公共的。代码隐藏类必须是部分的。

CLR 语言规则

尽管代码隐藏文件可以是 C++ 文件,但一些约定仍然遵守 CLR 语言形式,因此在 XAML 语法上没有区别。具体来讲,命名空间与任何 x:Class 值的类名组件之间的分隔符始终为一个点 ("."),即使与 XAML 关联的 C++ 代码文件中的命名空间和类名称之间的分隔符是 "::" 也是如此。如果在 C++ 中声明嵌套的命名空间,那么在指定 x:Class 值的namespace 部分时,连续的嵌套命名空间字符串之间的分隔符也应是一个 ".",而不是 "::"。

x:FieldModifier 属性

修改 XAML 编译行为,使指定对象引用的字段被定义有 public 访问权限而不是默认的 private 行为。

XAML 属性用法

<object x:FieldModifier="public".../>

依存关系

还必须在同一元素上提供 x:Name attribute

备注

x:FieldModifier 属性的值将随编程语言而变。要使用的字符串将取决于每种语言实现其 CodeDomProvider 的方式以及它所返回的用来定义 TypeAttributes.Public 和 TypeAttributes.NotPublic 的含义的类型转换器。对于 C#、Microsoft Visual Basic 或 Visual C++ 组件扩展 (C++/CX),你可以将字符串赋值 为 "public" 或 "Public";分析器没有强制规定此属性值的大小写。

你还可以指定 NonPublic(在 C# 或 C++/CX 中为 internal,在 Visual Basic 中为 Friend),但这不常见。对于 Windows 运行时 XAML 代码生成模型,没有对其应用任何内部访问权限。Private 访问权限是默认设置。

x:FieldModifier 仅适合具有 x:Name attribute 的元素,因为一旦该名称是公共的,它将用来引用字段。

注意  Windows 运行时 XAML 不支持 x:ClassModifier 或 x:Subclass

x:Key 属性

唯一标识作为资源被创建和引用的元素,这些资源存在于一个 ResourceDictionary 中。

XAML 属性使用方法

 
 
<ResourceDictionary>
  <object x:Key="stringKeyValue".../>
</ResourceDictionary>

XAML 属性使用方法(隐式 ResourceDictionary

 
 
<object.Resources>
  <object x:Key="stringKeyValue".../>
</object.Resources>

XAML 值

术语描述

object

任何可共享的对象。请参阅 ResourceDictionary 和 XAML 资源引用

stringKeyValue

一个用作键的真实字符串,它必须遵守 XamlName 语法。请参阅下面的“XamlName 语法”。

 XamlName 语法

以下是在 Windows 运行时 XAML 实现中作为键使用的字符串的规范语法:

 
 
XamlName ::= NameStartChar (NameChar)*
NameStartChar ::= LetterCharacter | '_'
NameChar ::= NameStartChar | DecimalDigit
LetterCharacter ::= ('a'-'z') | ('A'–'Z')
DecimalDigit ::= '0'-'9'
CombiningCharacter::= none
  • 字符被限制在较低的 ASCII 范围,说得更具体些,就是大写和小写罗马字母、数字和下划线 (_) 字符。
  • 不支持 Unicode 字符范围。
  • 名称不能以数字开头。

备注

ResourceDictionary 的子元素一般包含一个 x:Key 属性,该属性在该词典中指定一个唯一的键值。键唯一性在加载时由 XAML 处理器执行。非唯一的 x:Key 值将导致 XAML 分析异常。如果 StaticResource 发出请求,任何未解析的键也会导致 XAML 分析异常。

x:Key 和 x:Name 不是相同的概念。x:Key 仅用于资源词典中。x:Name 用于 XAML 的所有区域。一个使用键值的FindName 调用不会检索键资源。

请注意,在给出的隐式语法中,ResourceDictionary 对象在 XAML 处理器生成一个新对象来填充 Resources 集合的方式上是隐式的。

指定 x:Key 的代码等效于任何结合使用一个键和基础 ResourceDictionary 的操作。例如,当向一个ResourceDictionary 添加资源时,一个应用于资源标记中的 x:Key 等效于 Insert 的 key 参数的值。

如果资源字典中的某个项是目标 Style 或 ControlTemplate,则它可以省略 x:Key 的值;在每一种情况下,该资源项的隐式键都是解释为字符串的 TargetType 值。有关详细信息,请参阅快速入门:设置控件的样式和 ResourceDictionary 和 XAML 资源引用

x:Name 属性

唯一标识对象元素,可方便从代码隐藏或一般代码中访问已实例化的对象。应用于支持的编程模型之后,x:Name 可视为等效于持有一个对象引用(由一个构造函数返回)的变量。

XAML 属性使用方法

 
 
<object x:Name="XAMLNameValue".../>

XAML 值

术语描述

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 值。

备注

当处理 XAML 时,指定的 x:Name 变成一个在基础代码中创建的字段的名称,该字段持有该对象的引用。创建此字段的过程由 MSBuild 目标步骤执行,这些步骤还负责连接一个 XAML 文件和它的代码隐藏的分部类。此行为不一定是由 XAML 语言指定的,它是 WIndows 运行时 XAML 编程的特定实现,应用在其编程和应用程序模型中使用 x:Name

每个已定义的 x:Name 在一个 XAML 名称范围中必须是唯一的。通常,XAML 名称范围在所加载页面的根元素级别定义,其中包含单个 XAML 页面中该元素下面的所有元素。其他 XAML 名称范围由在该页面上定义的任何控件模板或数据模板定义。在运行时,其他 XAML 名称范围是为从所应用的控件模板创建的对象树的根,以及由从 XamlReader.Load调用创建的对象树定义的。有关详细信息,请参阅 XAML 空间范围

在将元素引入设计界面时,设计工具常常会自动为它们生成 x:Name 值。该自动生成架构因使用的设计器不同而不同,但一种典型的架构是生成一个字符串,它以支持该元素的类名开头,后跟一个延长的整数。例如,如果向设计器引入第一个 Button 元素,则可以在 XAML 中看到,此元素拥有 x:Name 属性值 "Button1"。

x:Name 无法在 XAML 属性元素语法中或在代码中使用 SetValue 设置。只能在元素上使用 XAML 属性语法来设置x:Name

注意  特别是对于 C++ 应用,不为 XAML 文件或页面的根元素创建 x:Name 引用的支持字段。如果你需要从 C++ 代码隐藏来引用根对象,请使用其他 API 或树形遍历。例如,你可以为已知的命名子元素调用 FindName,然后调用Parent

x:Name 和其他 Name 属性

Windows 运行时 XAML 中使用的一些类型还具有一个名为 Name 的属性。例如,FrameworkElement.Name 和TextElement.Name

如果 Name 可用作一个元素上的可设置属性,Name 和 x:Name 可在 XAML 中交替使用,但如果在相同元素上指定了这两个属性,会发生错误。有时,会存在一个只读的 Name 属性(如 VisualState.Name)。如果出现这种情况,请在 XAML 中始终使用 x:Name 对该元素进行命名,而且对于一些少见的代码方案使用只读的 Name

通常,使用设计工具(例如 Blend for Microsoft Visual Studio 2013)来创建用户界面的 XAML。由设计工具输出所创建的 XAML 通常在元素上一致地生成 x:Name 属性,即使在一个等效的 Name 属性可用时也是如此。

注意  FrameworkElement.Name 通常不应当用于更改最初由 x:Name 设置的值,但这个一般规则有一些例外的场景。在典型的场景中,XAML 名称范围的创建和定义是一个 XAML 处理器操作。在运行时修改FrameworkElement.Name 可能会导致不一致的 XAML 名称范围/专用字段命名对齐,这种不一致在代码隐藏文件中很难跟踪。

x:Name 和 x:Key

x:Name 可以作为一个属性应用到 ResourceDictionary 内的元素,以充当 x:Key 属性的替代属性。(通常,要求ResourceDictionary 中的所有元素都必须具有一个 x:Key。)这对于情节提要动画很常见。有关详细信息,请参阅ResourceDictionary 和 XAML 资源引用

x:Null 标记扩展

指定 null 作为通过一个 XAML 属性设置的属性的值。

XAML 属性使用方法

 
 
<object property="{x:Null}" .../>

 XAML 对象元素使用方法

 
 
<object>
  <object.property>
    <x:Null />
  </object.property>
</object>

备注

对于 C# 和 C++,表示空引用的关键字是 null。Microsoft Visual Basic 的 null 引用关键字是 Nothing

x:Null 标记扩展没有可设置的属性。

引用类型依赖属性的初始未设置值未必都是 null。每个依赖属性的初始默认值可能不同。许多依赖属性不会接受 null 作为值,无论是通过标记还是代码,这归因于其内部实现。在这样的情况下,使用 x:Null 设置 XAML 属性值可能会导致分析器异常。

x:Null 是标记扩展。XAML 中的标记扩展使用 "{" 和 "}" 字符,XAML 处理器实现可识别这些字符,将属性值的处理转义为文字或处理程序引用以外的内容。属性语法是此标记扩展使用中最常见的语法。x:Null 也可用于属性元素语法中。

某些 Windows 运行时类型可为空。在可空类型尚未使用 null 作为默认值时,可以使用 x:Null 在 XAML 中设置为 null值。 如果使用的是 Visual C++ 组件扩展 (C++/CX),则可空类型表示为 Platform::IBox<T>。如果使用的是 Microsoft .NET 语言,则可空类型表示为 Nullable<T>

x:Uid 指令

为标记元素提供一个唯一标识符。对于 Windows 运行时 XAML,这个唯一标识符供 XAML 本地化过程和工具使用(例如,使用 .resw 资源文件中的资源)。

XAML 属性使用方法

 
 
<object x:Uid="stringID".../>

XAML 值

术语描述

stringID

一个唯一标识应用中的 XAML 元素并且是资源文件中资源路径一部分的字符串。请参阅备注。

备注

使用 x:Uid 可以标识 XAML 中的对象元素。此对象元素通常是 UI 中显示的控件类或其他元素的实例。用在 x:Uid 中的字符串与用在资源文件中的字符串之间的关系是:资源文件字符串包括 x:Uid,其后面是一个点 (.),然后是正本地化的元素的特定属性名。考虑此示例:

 
 
<Button x:Uid="GoButton" Content="Go"/>

若要指定要替换显示文本 Go 的内容,你必须指定来自资源文件的新资源。资源文件中应当包含一个与名为 "GoButton.Content" 的资源相对应的条目。在本例中,Content 是由 Button 类继承的特定属性。你还可以为该按钮的其他属性提供本地化值,例如,可以为 "GoButton.FlowDirection" 提供基于资源的值。有关如何将 x:Uid 与资源文件一起使用的详细信息,请参阅快速入门:翻译 UI 资源

在实际意义上,要证明哪些字符串可用于 x:Uid 值,这取决于哪些字符串是 resw 文件和资源路径中的合法标识符。

在规定的 XAML 本地化场景中,x:Uid 与 x:Name 是分离的,所以用于本地化的标识符对 x:Name 的编程模型含义没有任何依赖性。而且,x:Name 由 XAML 名称范围这一概念控制,而 x:Uid 的唯一性由数据包资源索引 (PRI) 系统来控制。有关详细信息,请参阅资源管理系统

Windows 运行时 XAML 在 x:Uid 唯一性上使用的规则不同于以前利用 XAML 的技术所使用的规则。对于 Windows 运行时 XAML,在多个 XAML 元素上使用相同的 x:Uid ID 值作为指令是合法的。但是,每个这样的元素必须在解析资源文件中的资源时共享相同的解析逻辑。另外,一个项目中的所有 XAML 文件共享一个资源范围来解析 x:Uid,因此没有针对各个 XAML 文件的 x:Uid 范围概念。

在某些情况下,你将使用资源路径,而不是数据包资源索引 (PRI) 系统的内置功能。用作 x:Uid 值的任何字符串都会定义一个资源路径,该路径以 ms-resource:///Resources/ 开头并包括 x:Uid 字符串。该路径以你在资源文件中指定的属性名或者在其他情况下作为目标的属性名结尾。

请勿将 x:Uid 放在属性元素上,Windows 运行时 XAML 中不允许这样做。

XAML 固有数据类型

用于 Windows 运行时的 XAML 为多种数据类型提供了语言级支持,这些类型是 CLR 和其他编程语言(例如 C++)中的常用原语。

XAML 固有数据类型在使用上的最大共同点体现于资源在 XAML 资源词典中定义时。此时你可以定义常数,例如用于多个值的数字。或者,你也可能使用通过布尔值或字符串构建动画的情节提要动画,随后还需一个用于表示该布尔值或字符串的 XAML 对象元素,以填写 ObjectAnimationUsingKeyFrames 定义的关键帧。Windows 运行时默认 XAML 模板同时采用这两种技术。

用于 Windows 运行时的 XAML 提供了对以下类型的语言级支持。

XAML 原语描述
x:Boolean 对于 CLR 支持来说,原语对应于 Boolean。 XAML 分析 x:Boolean 的值时区分大小写。请注意,"x:Bool" 不是可接受的替代原语。
x:String 对于 CLR 支持来说,原语对应于 String。对字符串的编码默认采用包围 XML 编码。
x:Double 对于 CLR 支持来说,原语对应于 Double。 除了数字值,x:Double 的文本语法支持令牌 "NaN",这是将布局行为的 "Auto" 存储为资源值的方式。对这些令牌的处理区分大小写。 你可以使用科学计数法,例如将 1,000,000 记为 "1+E06"。
x:Int32 对于 CLR 支持来说,原语对应于 Int32x:Int32 被视为带有符号,你可以为负整数包含减号(“-”)。在 XAML 中,文本语法中缺少符号表示有符号正值。

这些 XAML 语言原语一般是在 XAML 中定义使用 x: 前缀的对象元素的唯一情形。所有其他 XAML 语言特性通常以属性或标记扩展的形式使用。

注意  根据惯例,我们给出了 XAML 语言原语和所有其他 XAML 语言元素,包括 "x:" 前缀。这是在真实标记中使用 XAML 语言元素的典型方式。XAML 文档和 XAML 规范中都采用了这一惯例。

其他 XAML 原语

XAML 2009 规范还介绍了其他 XAML 语言级原语,例如 x:Uri 和 x:Single。除本节表格中所列项目外,适用于 Windows 运行时的 XAML 当前不支持其他 XAML 词汇表或 XAML 2009 规格所定义的 XAML 语言原语。

注意  日期和时间(使用 DateTime 或 DateTimeOffsetTimeSpan 或 System.TimeSpan 的属性)不可使用 XAML 原语设置。总体而言,这些属性根本不可以采用 XAML 设置,因为 Windows 运行时 XAML 分析程序中没有用于日期和时间的从字符串转换的默认行为。若要获取任何日期和时间属性的初始化值,你必须使用在页面或元素加载时运行的代码隐藏文件。

原文地址:https://www.cnblogs.com/tianma3798/p/3715452.html