.NET XAML 服务的 XAML 命名空间
XAML 命名空间是一个概念,它扩展了 XML 命名空间的定义。 与 XML 命名空间类似,可以使用标记中的 xmlns
属性定义 XAML 命名空间。 XAML 命名空间也表示在 XAML 节点流和其他 XAML 服务 API 中。 本主题定义 XAML 命名空间概念,并介绍了如何定义 XAML 命名空间,以及如何由 .NET XAML 服务的 XAML 架构上下文和其他方面使用。
XML 命名空间和 XAML 命名空间
XAML 命名空间是一个专用 XML 命名空间,就像 XAML 是一种专用的 XML 形式,并对其标记使用基本 XML 窗体一样。 在标记中,通过应用于元素的 xmlns
属性声明 XAML 命名空间及其映射。
xmlns
声明可以与 XAML 命名空间声明的元素相同。 对元素进行的 XAML 命名空间声明对于该元素、该元素的所有属性以及该元素的所有子元素都有效。 只要属性名称本身在标记中引用前缀作为其属性名称的一部分,属性就可以使用与包含特性的元素不同的 XAML 命名空间。
XAML 命名空间与 XML 命名空间的区别在于,XML 命名空间可用于引用架构或仅区分实体。 对于 XAML,XAML 中使用的类型和成员最终必须解析为支持类型,并且 XML 架构概念不适用于此功能。 XAML 命名空间包含 XAML 架构上下文必须具有的信息才能执行此类型映射。
XAML 命名空间组件
XAML 命名空间定义有两个组件:前缀和标识符。 当 XAML 命名空间在标记中声明或在 XAML 类型系统中定义时,其中每个组件都存在。
前缀可以是 XML 1.0 规范中 x
映射。 可以定义默认的 XAML 命名空间,其中未在定义中提供前缀,但如果定义或查询 by.NET 了 XAML 服务 API,则将其表示为空字符串。 通常,会有意选择默认 XAML 命名空间,以便通过 XAML 实现技术及其方案和词汇来提升前缀省略标记的最大化量。
标识符可以是 XML 1.0 规范中
为了向 XAML 架构上下文传达信息,XAML 命名空间的标识符可能仍采用 URI 形式。 但是,在这种情况下,URI 也声明为特定程序集或程序集列表中的匹配标识符。 这可以通过将程序集与 XmlnsDefinitionAttribute相关联来完成。 .NET XAML 服务中的默认 XAML 架构上下文支持标识 XAML 命名空间和支持基于 CLR 的类型解析行为的方法。 更通常,此约定可用于 XAML 架构上下文包含 CLR 或基于默认 XAML 架构上下文的情况,这是从 CLR 程序集读取 CLR 属性所必需的。
XAML 命名空间也可以通过传达 CLR 命名空间和类型定义程序集的约定进行标识。 此约定用于包含类型的程序集中不存在 XmlnsDefinitionAttribute 属性的情况。 此约定可能比 URI 约定更复杂,而且可能存在歧义和重复,因为有多种方法引用程序集。
使用 CLR 命名空间和程序集约定的标识符的最基本形式如下:
clr-namespace:clrnsName; assembly=assemblyShortName
clr-namespace:
和 ; assembly=
是语法的文本组件。
clrnsName 是标识 CLR 命名空间的字符串名称。 此字符串名称包括任何内部点字符(.),这些字符提供有关 CLR 命名空间及其与其他 CLR 命名空间的关系的提示。
assemblyShortName 是定义 XAML 中有用的类型的程序集的字符串名称。 要通过声明的 XAML 命名空间访问的类型应由程序集定义,并在由 clrnsName指定的 CLR 命名空间中声明。 此字符串名称通常与 AssemblyName.Name报告的信息并行。
CLR 命名空间和程序集约定的更完整定义如下所示:
clr-namespace:clrnsName; assembly=assemblyName
assemblyName 表示任何作为 Assembly.Load(String) 输入合法字符串。 此字符串可以包含区域性、公钥或版本信息(这些概念的定义在 Assembly的参考主题中定义)。 COFF 格式和证据(如其他 Load重载使用)与 XAML 程序集加载目的无关;所有加载信息都必须显示为字符串。
为程序集指定公钥是 XAML 安全性的有用技术,或者删除可能存在的歧义,如果程序集是用简单名称加载的,或者缓存或应用程序域中预先存在,则可能存在这种歧义。 有关详细信息,请参阅 XAML 安全注意事项。
XAML 服务 API 中的 XAML 命名空间声明
在 XAML 服务 API 中,XAML 命名空间声明由 NamespaceDeclaration 对象表示。 如果要在代码中声明 XAML 命名空间,则调用 NamespaceDeclaration(String, String) 构造函数。
ns
和 prefix
参数指定为字符串,为这些参数提供的输入对应于本主题前面提供的 XAML 命名空间标识符和 XAML 命名空间前缀的定义。
如果要检查 XAML 命名空间信息作为 XAML 节点流的一部分或通过对 XAML 类型系统的其他访问权限进行检查,NamespaceDeclaration.Namespace 报告 XAML 命名空间标识符,NamespaceDeclaration.Prefix 报告 XAML 命名空间前缀。
在 XAML 节点流中,XAML 命名空间信息可以显示为应用其实体之前的 XAML 节点。 这包括 XAML 命名空间信息位于 XAML 根元素 StartObject
之前的情况。 有关详细信息,请参阅 了解 XAML 节点流结构和概念。
对于使用 .NET XAML 服务 API 的许多方案,至少应存在一个 XAML 命名空间声明,并且声明必须包含或引用 XAML 架构上下文所需的信息。 XAML 命名空间必须指定要加载的程序集,或有助于解析已加载或由 XAML 架构上下文已知的命名空间和程序集中的特定类型。
若要生成 XAML 节点流,必须通过 XAML 架构上下文获取 XAML 类型信息。 如果不首先确定要创建的每个节点的相关 XAML 命名空间,则无法确定 XAML 类型信息。 此时,尚未创建类型实例,但 XAML 架构上下文可能需要查找定义程序集和后备类型中的信息。 例如,为了处理标记 <Party><PartyFavor/></Party>
,XAML 架构上下文必须能够确定 Party
ContentProperty
的名称和类型,因此还必须知道 Party
和 PartyFavor
的 XAML 命名空间信息。 对于默认 XAML 架构上下文,静态反射报告在节点流中生成 XAML 类型节点所需的大量 XAML 类型系统信息。
为了从 XAML 节点流生成对象图,XAML 命名空间声明必须存在原始标记中使用的每个 XAML 前缀,并在 XAML 节点流中记录。 此时,将创建实例,并发生真正的类型映射行为。
如果需要预填充 XAML 命名空间信息,如果希望 XAML 架构上下文使用的 XAML 命名空间未在标记中定义,可以使用的一种方法是在 XmlReader的 XmlParserContext 中声明 XML 命名空间声明。 然后,使用该 XmlReader 作为 XAML 读取器构造函数的输入,或 XamlServices.Load(XmlReader)。
与 .NET XAML 服务中的 XAML 命名空间处理相关的另外两个 API 是属性 XmlnsDefinitionAttribute 和 XmlnsPrefixAttribute。 这些属性适用于程序集。 XAML 架构上下文使用 XmlnsDefinitionAttribute 来解释包含 URI 的任何 XAML 命名空间声明。 XmlnsPrefixAttribute 由发出 XAML 的工具使用,以便可以使用可预测的前缀序列化特定的 XAML 命名空间。 有关详细信息,请参阅 XAML-Related 自定义类型和库的 CLR 属性。