2.3 命名空间
比较上述XAML代码示例和相应的C#代码示例,最神秘的地方在于XML命名空间(http:// schemas.microsoft.com/winfx/2006/xaml/presentation)是如何被映射到.NET命名空间(System. Windows.Controls)上的。该映射及其他WPF命名空间的映射是在WPF程序集中硬编码完成的,里面有好几个XmlnsDefinitionAttribute自定义特性的实例。(顺便说一句,在schemas.microsoft. com这个URL中不存在网页——这仅仅是一个人为设定的字符串,就像其他命名空间一样。)
XAML文件的根对象元素必须指定至少一个XML命名空间,用于验证自己和子元素。你可以(在根元素或子元素上)声明额外的XML命名空间,但每一个命名空间下的标识符都必须有一个唯一的前缀,例如,WPF的XAML文件都会使用第二个命名空间加上前缀x(记作xmlns:x而不仅仅是xmlns):
![]()
这是XAML语言命名空间,用于映射System.Windows.Markup命名空间中的类型,而且它也定义了XAML编译器或解析器中的一些特殊的指令。这些指令通常是作为XML元素的特性出现的,因此它们看上去像宿主元素的属性,但实际上并不是如此。如果想了解XAML关键字,请见2.8.3节。
我们把http://schemas.microsoft.com/winfx/2006/xaml/presentatio作为默认(主要)命名空间,把http://schemas.microsoft.com/winfx/2006/xaml 作为次要命名空间,次要命名空间的前缀是x,这仅仅是一个规则,就像C#文件要以using System;指令开始一样。你可以如下改写原来那个XAML文件,意思是相同的。
![]()
当然,从可读性来讲,在使用这些常见的命名空间的时候不需要前缀(即原始的XML命名空间),其他一些命名空间则使用一个短前缀,这样处理是有道理的。
隐式.NET命名空间
WPF把下面所有的.NET命名空间映射到XML命名空间http://schemas.microsoft.com/
winfx/2006/xaml/presentation ,而这个命名空间将在整本书中使用。
q System.Windows
q System.Windows.Automation
q System.Windows.Controls
q System.Windows.Controls.Primitives
q System.Windows.Data
q System.Windows.Documents
q System.Windows.Forms.Integration
q System.Windows.Ink
q System.Windows.Input
q System.Windows.Media
q System.Windows.Media.Animation
q System.Windows.Media.Effects
q System.Windows.Media.Imaging
q System.Windows.Media.Media3D
q System.Windows.Media.TextFormatting
q System.Windows.Navigation
q System.Windows.Shapes
因为这是一个多对一的映射,WPF的设计者需要保证不要引入两个同样名称的类,虽然这些类是放在不同的.NET命名空间中的。
提示 本章中独立的XAML示例显式地指定了它们的命名空间,但是在后面的章节,大多数示例是假设http://schemas.microsoft.com/winfx/2006/xaml/presentation命名空间被声明为主要命名空间,而http://schemas.microsoft.com/winfx/2006/xaml则被声明为次要命名空间,前缀是x。如果你想在IE浏览器中查看这些内容,或者将它们复制到像XamlPad这样的应用程序中,请确保这两个命名空间已经显式添加。





