天天看点

XAML 命名空间和命名空间映射

本主题将介绍大部分 xaml 文件的根元素中存在的 xml/xaml 命名空间 (xmlns)

映射。它还将介绍如何为自定义类型和程序集生成类似的映射。

无论是其一般用途还是 windows 运行时应用编程的应用上,xaml 都用于声明对象、这些对象的属性以及表示为层次结构的对象-属性关系。你在 xaml

中声明的对象受其他编程技术和语言定义的类型库或其他表示支持。这些库可能是:

windows 运行时的内置对象集合。这是一个固定的对象集合,从 xaml 访问这些对象使用内部类型映射和激活逻辑。

microsoft 或第三方提供的分布式库。

该库表示你的应用包含的以及你的包重新分发的第三方控件的定义。

你自己的库(属于你的项目的一部分),它包含部分或所有用户代码定义。

支持类型信息与特定 xaml 命名空间定义相关联。xaml 框架(如 windows 运行时)可聚合多个程序集和多个代码命名空间,以映射到单个 xaml

命名空间。这就支持涉及更大的编程框架或技术的 xaml 词汇表概念。xaml 词汇表可能非常大—例如该引用中为 windows 运行时应用记录的大部分 xaml

构成单个 xaml 词汇表。xaml 词汇表也可扩展:通过向支持代码定义添加类型来扩展它,从而确保在代码命名空间(已经用作 xaml

词汇表的映射的命名空间来源)中包含这些类型。

xaml 处理器在创建运行时对象表示时,可查找与该 xaml 命名空间关联的支持程序集的类型和成员。出于此原因,xaml

可用作一种形式化和交换对象构造定义行为的方式,并且 xaml 可用作 windows 应用商店应用的 ui 定义技术。

xaml 文件几乎总是在其根元素中声明一个默认 xaml 命名空间。默认 xaml

命名空间定义了无需使用前缀来限定即可声明哪些元素。例如,如果声明一个元素 <code>&lt;balloon /&gt;</code>,xaml

分析器期望一个 balloon 元素存在并且在默认的 xaml

命名空间中是有效的。相反,如果 balloon 不在已定义的默认 xaml

命名空间中,就必须使用一个前缀限定该元素名称,例如 <code>&lt;party:balloon /&gt;</code>。该前缀表明该元素存在于与默认命名空间不同的 xaml 命名空间中,你必须将一个 xaml

命名空间映射到前缀 party,然后才能使用此元素。 xaml

命名空间适用于在其上声明它们的特定元素,也适用于该元素在 xaml 结构中包含的任何元素。出于此原因,xaml 命名空间几乎总是在 xaml

文件的根元素上声明,以充分利用这种继承性。

在大多数 xaml 文件的根元素中,有两个 xmlns 声明。第一个声明将一个 xaml

命名空间映射为默认命名空间:<code>xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"</code>

这是多个也使用 xaml 作为 ui 定义标记格式的预处理器 microsoft 技术中使用的相同 xaml

命名空间标识符。使用相同的标识符是经过深思熟虑的,在将以前定义的 ui 迁移到使用 c++、c# 或 visual basic 的 windows

运行时应用时很有用。

第二个声明映射 xaml 定义的语言元素的一个独立的 xaml 命名空间,(通常)将它映射到 "x:"

前缀:<code>xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"</code>

此 xmlns 值和它所映射到的 "x:" 前缀对于在多个使用 xaml 的前置任务

microsoft 技术中使用的定义也是相同的。

这些声明之间的关系是,xaml 是一种语言定义,windows 运行时是一种实现,它使用 xaml 作为语言并定义一个特定的词汇表,它的类型在这里供

xaml 引用。

xaml 语言指定某些语言元素,其中每个元素应可通过适用于 xaml 命名空间的 xaml 处理器实现进行访问。项目模板、示例代码和语言特性文档遵循

xaml 语言 xaml 命名空间的 "x:" 映射约定。xaml 语言命名空间定义多个常用的功能,甚至对于使用 c++、c# 或 visual basic

的基本 windows 运行时应用,这些功能也是必要的。例如,为了将任何代码隐藏通过分部类联接到 xaml 文件,必须将该类命名为相关 xaml

文件的根元素中的  属性。或者,任何在

xaml 页面中定义为  中一个键资源的元素必须在相关的对象元素上设置  特性。

除了默认命名空间和 xaml 语言 xaml 命名空间 "x:",你也可能在 microsoft visual studio 生成的应用的初始默认

xaml 中看到其他的已映射 xaml 命名空间。

"d:" xaml 命名空间旨在提供设计器支持,尤其是 microsoft visual studio 的 xaml 设计界面中的设计器支持。" d:"

xaml 命名空间支持 xaml 元素上的设计器或设计时特性。这些设计器特性只影响 xaml 行为的设计方面。如果 windows 运行时 xaml

分析器在一个应用运行时加载相同的 xaml,设计器特性会被忽略。一般而言,设计器特性在任何 xaml

元素上是有效的,但在实际情况中,只有某些场景适合应用设计器特性。具体来讲,许多设计器特性是为了在你开发使用数据绑定的 xaml

和代码时,提供一种与数据上下文和数据源交互的更好体验。

d:designheight 和 d:designwidth 属性: 这些属性有时应用于 visual

studio 或其他 xaml 设计器图面为你创建的 xaml 文件的根。例如,如果你向应用项目中添加了新的 ,则这些属性是针对所创建的

xaml 的usercontrol 根设置的。这些属性更便于设计 xaml 内容组合,以便在将该 xaml

内容用于控件示例或更大 ui 页面的其他部分之后,你能够预测可能存在的布局约束。

注意  如果要从 microsoft silverlight 迁移

xaml,代表整个 ui

页面的根元素上可能存在下列特性。在这种情况下,你可能希望删除这些特性。与使用 d:designheight 和 d:designwidth 的固定大小页面布局相比,xaml

设计器的其他功能(如模拟器)对于设计能够很好地处理缩放和视图状态的页面布局或许更有用。

d:datacontext 特性:可以针对页面根或控件设置此特性,以便替代该对象所拥有的任何显式或继承的。

d:designsource 特性:为  指定设计时数据源,并替代 。

d:designinstance 和 d:designdata

标记扩展:这些标记扩展用于为 d:datacontext 或 d:designsource 提供设计时数据资源。在这里,我们不会完全记录如何使用设计时数据源资源。有关详细信息,请参阅。有关一些用法示例,请参阅。

" mc:" 表示并支持读取 xaml 的标记兼容性模式。通常,"d:"

前缀与特性 mc:ignorable 相关联。此技术使运行时 xaml 分析器忽略 "d:"

中的设计特性。

"local:" 是一个前缀,通常会在模板化 windows 应用商店应用项目的 xaml

页面中为你映射它。它映射为引用相同的命名空间,该命名空间旨在包含  类和所有

xaml 文件(包括 app.xaml)的代码。只要你在此相同命名空间中定义你要在 xaml

中使用的任何自定义类,你就可以使用 local: 前缀在 xaml 中引用你的自定义类型。来自模板化的

windows 应用商店应用项目的相关前缀是 common:。此前缀引用包含实用程序类(例如转换器和命令)的嵌套

"common" 命名空间,你可以在“解决方案资源管理器”视图的 common 文件夹中找到定义。

不要使用。"vsm:" 是有时在从其他 microsoft 技术导入的较老 xaml

模板中会看到的一个前缀。该命名空间最初解决了旧版命名空间工具问题。你应该在用于 windows 运行时的任何 xaml 中删除 "vsm:" 的 xaml

命名空间定义,更改、 和相关对象的任何前缀的用法,从而使用默认的

xaml 命名空间。有关 xaml 迁移的详细信息,请参阅。

你可以映射一个 xaml 命名空间,这样可使用 xaml

访问你自己的自定义类型。换句话说,你正在映射一个代码命名空间,因为它存在于一个定义了自定义类型的代码表示中,为它分配一个 xaml

命名空间以及一个前缀供其使用。针对 xaml 的自定义类型可在 microsoft .net 语言(c# 或 microsoft visual basic)或

c++

中定义。映射通过定义一个xmlns 前缀来执行。例如,<code>xmlns:mytypes</code> 定义一个新

xaml 命名空间,通过在所有用法中添加令牌 <code>mytypes:</code> 作为前缀来访问这个命名空间。

xmlns 定义包含一个值以及前缀命名。该值是一个包含在引号内的字符串,后跟一个等号。一种常见的 xml

约定是将 xml 命名空间与一个统一资源标识符 (uri) 相关联,这样就实现了唯一性和标识约定。你也可以在默认 xaml 命名空间和 xaml 语言 xaml

命名空间中看到此约定,也可以在 windows 运行时 xaml 所使用的且不太常见的 xaml 命名空间中看到此约定。对于映射自定义类型(而不是指定一个

uri)的 xaml 命名空间,你可以为定义添加令牌 "using:" 作为前缀。在 "using:" 令牌后,可命名代码命名空间。

例如,要映射一个允许你引用 "customclasses" 命名空间的 "custom1" 前缀,并使用来自该命名空间或程序集的类作为 xaml

中的前缀,你的 xaml

页面应在根元素上包含以下映射: <code>xmlns:custom1="using:customclasses"</code>

不需要映射同一页面范围中的分部类。例如,不需要前缀即可引用你为处理来自页面的 xaml ui 定义的事件而定义的任何事件处理程序。另外,visual

studio 生成的使用 c++、c# 或 visual basic 的 windows 运行时应用项目的许多起始 xaml 页面已映射 "local:"

前缀,它引用项目指定的默认命名空间和分部类定义所使用的命名空间。

如果使用 .net 语言(c# 或 microsoft visual basic)编写支持代码,你可能会在命名空间名称中使用一个点 (".")

的约定,以创建代码命名空间的概念性层次结构。如果命名空间定义包含一个点,则这个点应该是你在 "using:" 令牌之后指定的值的一部分。

如果代码隐藏文件或代码定义文件是 c++ 文件,那么某些约定仍然遵守公共语言运行时 (clr) 语言形式,因此在 xaml 语法上没有区别。如果在 c++

中声明嵌套的命名空间,则在指定 "using:" 令牌后的值时,连续的嵌套命名空间字符串之间的分隔符也应是一个 ".",而不是 "::"。

当你定义代码以供使用 xaml 时,请勿使用嵌套类型(例如在某个类中嵌套枚举)。无法评估嵌套类型。xaml

分析器无法区分某个点是嵌套类型名称的一部分,而不是命名空间名称的一部分。

定义 xaml

命名空间的支持类型的程序集名称不是在映射中指定的。关于哪些程序集可用的逻辑在应用定义级别控制,包含在基本应用部署和安全原则中。在项目设置中,将你希望作为

xaml 的一个代码定义源包含的任何程序集声明为一个独立程序集。有关详细信息,请参阅。

如果从主要应用的应用程序定义或页面定义中引用自定义类型,这些类型无需进一步的依赖程序集配置即可使用,但你仍然必须映射包含这些类型的代码命名空间。一种常见的约定是映射任何给定

xaml 页面的默认代码命名空间的前缀 "local"。此约定常常包含在 xaml 项目的初始项目模板中。

如果你引用附加属性,附加属性名称的所有者键入部分必须在默认 xaml

命名空间中,或者必须带有前缀。很少会独立于属性元素向属性添加前缀,但这种情况有时是必需的,特别是对于自定义附加属性而言。有关详细信息,请参阅。