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

本主题将介绍大部分 XAML 文件的根元素中存在的 XML/XAML 命名空间 (xmlns)
映射。它还将介绍如何为自定义类型和程序集生成类似的映射。

XAML
命名空间如何与代码定义和类型库相关

无论是其一般用途还是 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 文件几乎总是在其根元素中声明一个默认 XAML 命名空间。默认 XAML
命名空间定义了无需使用前缀来限定即可声明哪些元素。例如,如果声明一个元素 <Balloon />,XAML
分析器期望一个 Balloon 元素存在并且在默认的 XAML
命名空间中是有效的。相反,如果 Balloon 不在已定义的默认 XAML
命名空间中,就必须使用一个前缀限定该元素名称,例如 <party:Balloon
/>
。该前缀表明该元素存在于与默认命名空间不同的 XAML 命名空间中,你必须将一个 XAML
命名空间映射到前缀 party,然后才能使用此元素。 XAML
命名空间适用于在其上声明它们的特定元素,也适用于该元素在 XAML 结构中包含的任何元素。出于此原因,XAML 命名空间几乎总是在 XAML
文件的根元素上声明,以充分利用这种继承性。

默认和
XAML 语言 XAML 命名空间声明

在大多数 XAML 文件的根元素中,有两个 xmlns 声明。第一个声明将一个 XAML
命名空间映射为默认命名空间:xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

这是多个也使用 XAML 作为 UI 定义标记格式的预处理器 Microsoft 技术中使用的相同 XAML
命名空间标识符。使用相同的标识符是经过深思熟虑的,在将以前定义的 UI 迁移到使用 C++、C# 或 Visual Basic 的 Windows
运行时应用时很有用。

第二个声明映射 XAML 定义的语言元素的一个独立的 XAML 命名空间,(通常)将它映射到 "x:"
前缀:xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

此 xmlns 值和它所映射到的 "x:" 前缀对于在多个使用 XAML 的前置任务
Microsoft 技术中使用的定义也是相同的。

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

XAML 语言指定某些语言元素,其中每个元素应可通过适用于 XAML 命名空间的 XAML 处理器实现进行访问。项目模板、示例代码和语言特性文档遵循
XAML 语言 XAML 命名空间的 "x:" 映射约定。XAML 语言命名空间定义多个常用的功能,甚至对于使用 C++、C# 或 Visual Basic
的基本 Windows 运行时应用,这些功能也是必要的。例如,为了将任何代码隐藏通过分部类联接到 XAML 文件,必须将该类命名为相关 XAML
文件的根元素中的 x:Class 属性。或者,任何在
XAML 页面中定义为 ResourceDictionary 中一个键资源的元素必须在相关的对象元素上设置 x:Key 特性。

其他
XAML 命名空间

除了默认命名空间和 XAML 语言 XAML 命名空间 "x:",你也可能在 Microsoft Visual Studio 生成的应用的初始默认
XAML 中看到其他的已映射 XAML 命名空间。

d: (http://schemas.microsoft.com/expression/blend/2008)

"d:" XAML 命名空间旨在提供设计器支持,尤其是 Microsoft Visual Studio 的 XAML 设计界面中的设计器支持。" d:"
XAML 命名空间支持 XAML 元素上的设计器或设计时特性。这些设计器特性只影响 XAML 行为的设计方面。如果 Windows 运行时 XAML
分析器在一个应用运行时加载相同的 XAML,设计器特性会被忽略。一般而言,设计器特性在任何 XAML
元素上是有效的,但在实际情况中,只有某些场景适合应用设计器特性。具体来讲,许多设计器特性是为了在你开发使用数据绑定的 XAML
和代码时,提供一种与数据上下文和数据源交互的更好体验。

  • d:DesignHeight 和 d:DesignWidth 属性: 这些属性有时应用于 Visual
    Studio 或其他 XAML 设计器图面为你创建的 XAML 文件的根。例如,如果你向应用项目中添加了新的 UserControl,则这些属性是针对所创建的
    XAML 的UserControl 根设置的。这些属性更便于设计 XAML 内容组合,以便在将该 XAML
    内容用于控件示例或更大 UI 页面的其他部分之后,你能够预测可能存在的布局约束。

    注意  如果要从 Microsoft Silverlight 迁移
    XAML,代表整个 UI
    页面的根元素上可能存在下列特性。在这种情况下,你可能希望删除这些特性。与使用 d:DesignHeight 和 d:DesignWidth 的固定大小页面布局相比,XAML
    设计器的其他功能(如模拟器)对于设计能够很好地处理缩放和视图状态的页面布局或许更有用。


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

  • d:DesignSource 特性:为 CollectionViewSource 指定设计时数据源,并替代 Source

  • d:DesignInstance 和 d:DesignData
    标记扩展:
    这些标记扩展用于为 d:DataContext 或 d:DesignSource 提供设计时数据资源。在这里,我们不会完全记录如何使用设计时数据源资源。有关详细信息,请参阅设计时特性。有关一些用法示例,请参阅“数据绑定概述”主题的“在设计器中显示数据”

mc: (http://schemas.openxmlformats.org/markup-compatibility/2006)

" mc:" 表示并支持读取 XAML 的标记兼容性模式。通常,"d:"
前缀与特性 mc:Ignorable 相关联。此技术使运行时 XAML 分析器忽略 "d:"
中的设计特性。

local: 和 common:

"local:" 是一个前缀,通常会在模板化 Windows 应用商店应用项目的 XAML
页面中为你映射它。它映射为引用相同的命名空间,该命名空间旨在包含 x:Class 类和所有
XAML 文件(包括 app.xaml)的代码。只要你在此相同命名空间中定义你要在 XAML
中使用的任何自定义类,你就可以使用 local: 前缀在 XAML 中引用你的自定义类型。来自模板化的
Windows 应用商店应用项目的相关前缀是 common:。此前缀引用包含实用程序类(例如转换器和命令)的嵌套
"Common" 命名空间,你可以在“解决方案资源管理器”视图的 Common 文件夹中找到定义。

vsm:

不要使用。"vsm:" 是有时在从其他 Microsoft 技术导入的较老 XAML
模板中会看到的一个前缀。该命名空间最初解决了旧版命名空间工具问题。你应该在用于 Windows 运行时的任何 XAML 中删除 "vsm:" 的 XAML
命名空间定义,更改VisualStateVisualStateGroup 和相关对象的任何前缀的用法,从而使用默认的
XAML 命名空间。有关 XAML 迁移的详细信息,请参阅
Silverlight 或 WPF XAML/代码迁移到 Windows 运行时应用

将自定义类型映射到 XAML 命名空间和前缀

你可以映射一个 XAML 命名空间,这样可使用 XAML
访问你自己的自定义类型。换句话说,你正在映射一个代码命名空间,因为它存在于一个定义了自定义类型的代码表示中,为它分配一个 XAML
命名空间以及一个前缀供其使用。针对 XAML 的自定义类型可在 Microsoft .NET 语言(C# 或 Microsoft Visual Basic)或
C++
中定义。映射通过定义一个xmlns 前缀来执行。例如,xmlns:myTypes 定义一个新
XAML 命名空间,通过在所有用法中添加令牌 myTypes: 作为前缀来访问这个命名空间。

xmlns 定义包含一个值以及前缀命名。该值是一个包含在引号内的字符串,后跟一个等号。一种常见的 XML
约定是将 XML 命名空间与一个统一资源标识符 (URI) 相关联,这样就实现了唯一性和标识约定。你也可以在默认 XAML 命名空间和 XAML 语言 XAML
命名空间中看到此约定,也可以在 Windows 运行时 XAML 所使用的且不太常见的 XAML 命名空间中看到此约定。对于映射自定义类型(而不是指定一个
URI)的 XAML 命名空间,你可以为定义添加令牌 "using:" 作为前缀。在 "using:" 令牌后,可命名代码命名空间。

例如,要映射一个允许你引用 "CustomClasses" 命名空间的 "custom1" 前缀,并使用来自该命名空间或程序集的类作为 XAML
中的前缀,你的 XAML
页面应在根元素上包含以下映射: xmlns:custom1="using:CustomClasses"

不需要映射同一页面范围中的分部类。例如,不需要前缀即可引用你为处理来自页面的 XAML UI 定义的事件而定义的任何事件处理程序。另外,Visual
Studio 生成的使用 C++、C# 或 Visual Basic 的 Windows 运行时应用项目的许多起始 XAML 页面已映射 "local:"
前缀,它引用项目指定的默认命名空间和分部类定义所使用的命名空间。

CLR 语言规则

如果使用 .NET 语言(C# 或 Microsoft Visual Basic)编写支持代码,你可能会在命名空间名称中使用一个点 (".")
的约定,以创建代码命名空间的概念性层次结构。如果命名空间定义包含一个点,则这个点应该是你在 "using:" 令牌之后指定的值的一部分。

如果代码隐藏文件或代码定义文件是 C++ 文件,那么某些约定仍然遵守公共语言运行时 (CLR) 语言形式,因此在 XAML 语法上没有区别。如果在 C++
中声明嵌套的命名空间,则在指定 "using:" 令牌后的值时,连续的嵌套命名空间字符串之间的分隔符也应是一个 ".",而不是 "::"。

当你定义代码以供使用 XAML 时,请勿使用嵌套类型(例如在某个类中嵌套枚举)。无法评估嵌套类型。XAML
分析器无法区分某个点是嵌套类型名称的一部分,而不是命名空间名称的一部分。

自定义类型和程序集

定义 XAML
命名空间的支持类型的程序集名称不是在映射中指定的。关于哪些程序集可用的逻辑在应用定义级别控制,包含在基本应用部署和安全原则中。在项目设置中,将你希望作为
XAML 的一个代码定义源包含的任何程序集声明为一个独立程序集。有关详细信息,请参阅
C# 和 Visual Basic 中创建 Windows 运行时组件

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

附加属性

如果你引用附加属性,附加属性名称的所有者键入部分必须在默认 XAML
命名空间中,或者必须带有前缀。很少会独立于属性元素向属性添加前缀,但这种情况有时是必需的,特别是对于自定义附加属性而言。有关详细信息,请参阅自定义附加属性

时间: 2024-10-15 09:10:53

XAML 命名空间和命名空间映射的相关文章

ros名称、命名空间和重映射

一 概论 名称就是代号,ros中的节点.话题和参数的名称必须是唯一的,这很容易想到,如果你认识两个叫一样名字的人,单凭一个名字你是分辨不出来说的这个人到底是谁,所以 ros中的名称必须是唯一的. 但是,这个规定与现实不符啊,分明现实中就有这种情况啊,所以我们很容易想到两种办法 1 把两个人的名字前加点东西,如三班的A和四班的A(命名空间) 2 分别叫这两个人的小名,或者绰号.(重映射) 通过这种方式就可以解决名字冲突的问题. ros中这两种方式分别叫做命名空间和重映射. 二 命名空间 我们在安装

开启phoenix命名空间的自动映射

1.在测试环境 hbase 全部集群的 hbase-site.xml 配置文件都加上这个配置,开启phoenix命名空间的自动映射 <property> <name>phoenix.schema.isNamespaceMappingEnabled</name> <value>true</value> </property>在/do2cloud/apache-phoenix-5.0.0-HBase-2.0-bin/bin/hbase-s

.NET Framework 类库——C#命名空间大全

引用地址:https://msdn.microsoft.com/zh-cn/library/gg145045.aspx C# using引用时,不知道有哪些命名空间,这下转载收集一篇,方面查找使用. NET Framework 类库是一个由类.接口和值类型组成的库,通过该库中的内容可访问系统功能.它是生成 .NET Framework 应用程序.组件和控件的基础.类库中的命名空间和命名空间类别在下表中列出,在此参考中有详细记录.将按使用情况列出命名空间和类别,最常用的命名空间会先列出. 命名空间

初学者教程之命名空间,范围解析及LEDB规则

2014年5月12日 Sebastian Raschka编写 这是一篇关于采用LEGB规则实现Python变量命名空间及范围解析的简短教程.下面章节将会提供简短的可以说明问题的示例代码块来简要阐述问题.您可以简单的从头至尾阅读本教程,但我鼓励您去执行这些代码段.你可以复制粘贴这些代码段,但是为了方便您也可以下载IPython笔记. 章节 ? 章节 ? 目标 ? 命名空间和范围介绍 o 命名空间 o 范围 o 提示: o 通过LEGB规则解析变量名的范围 ?1. LG-本地和全局范围 o 原因:

python命名空间和作用域

一.命名空间 定义:名称到对象的映射.命名空间是一个字典的实现,键为变量名,值是变量对应的值.各个命名空间是独立没有关系的,一个命名空间中不能有重名,但是不同的命名空间可以重名而没有任何影响. 分类: 1.全局命名空间: 在代码一运行时就创建的命名空间. 2.局部命名空间: 指在程序运行过程中开辟的临时空间,比如函数,类 3.内置命名空间: 在程序运行加载代码前,提前开辟用于存储常用内置方法的空间,比如input,print,str,list,都属于内置命名空间的变量 加载顺序: 加载顺序:内置

spring16-----XML命名空间和Spring配置文件中的头

一. 什么是命名空间 在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突.类似package的作用. 这个 XML 文档携带着某个表格中的信息: 1 <table> 2 <tr> 3 <td>Apples</td> 4 <td>Bananas</td> 5 </tr> 6 </table> 这个 XML 文档携带有关桌子的信息(一件家具): 1 <table&g

PHP 命名空间与自动加载机制

include 和 require 是PHP中引入文件的两个基本方法.在小规模开发中直接使用 include 和 require 没哟什么不妥,但在大型项目中会造成大量的 include 和 require 堆积.这样的代码既不优雅,执行效率也很低,而且维护起来也相当困难. 为了解决这个问题,部分框架会给出一个引入文件的配置清单,在对象初始化的时候把需要的文件引入.但这只是让代码变得更简洁了一些,引入的效果仍然是差强人意.PHP5 之后,随着 PHP 面向对象支持的完善,__autoload 函

详解Python的作用域和命名空间

最近在学习Python,不得不说,Python真的是一门很好用的语言.但是学习的过程中关于变量作用域(scope)的命名空间(namespace)的问题真的把我给搞懵了.在查阅了相关资料之后,觉得自己对Python的作用域和命名空间有了一定得了解.故写在这里,一方面加深自己的理解,另一方面分享知识. 一.本篇博客需要解决的问题. 1.什么是作用域和命名空间? 2.Python中作用域和命名空间的工作原理是什么? 3.我怎样在Python中声明一个全局变量(global variable),局部变

浅析PHP类的自动加载和命名空间

php是使用require(require_once)和include(include_once)关键字加载类文件.但是在实际的开发工程中我们基本上不会去使用这些关键字去加载类. 因为这样做会使得代码的维护相当的困难.实际的开发中我们会在文件的开始位置用use关键字使用类,然后直接new这个类就可以了. 至于类是怎么加载的,一般都是框架或者composer去实现的. <?php use Illuminate\Container\Container; $container = new Contai