XAML的语法和规则,很大程度上和XML相似。对于语法这种东西,我感觉太大了,之前修的一门编译原理我已经很
头大了。所以本篇我就说说作为强迫症患者,对于.xaml文件那些开头的奇奇怪怪的定义是怎么一回事。
XAML里面的元素都是对应着.NET里面的类的,如在XAML中打出<Button>..</Button>,那么Button这个元素对应
着.NET里面的哪个类呢,换言之XAML解释器如何解读它是按钮而不是文本控件呢?
可以看出我们只提供类名是不够的,因为在不同的情况下,类名一样的情况会很多,这样就让XAML解析器很困惑,
到底用哪种类的声明去解释这个类呢?因为类都声明在某个命名空间之下,所以也可以这理解,这个类到底是在哪个
命名空间下被声明的呢?
所以就有如下的XAML文件开头的代码,或者说声明:
<Pagex:Class="App1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App1"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
首先上述代码声明了若干个XML命名空间,XAML文档本身就是一个完整的XML文档。
而xmlns是XML的一个特殊特性,用来声明命名空间。一旦声明了一个命名空间,在文档中的任何地方都可以使用该
命名空间。像"using:App1"表示引用的是应用程序里面的App1空间,所以可以在XAML中通过local表示符来使用
App1控件下的控件或者其他类。
总结下来形式就为xmlns:命名空间别名="命名空间",然后下面的代码可以使用命名空间别名:类名来调用空间中的
类。
但是注意到Grid并没有一个空间引用的前缀,那么Grid元素被解析成哪个类呢?
可能是Windows.UI.Xaml.Controls.Grid类,也可能是第三方组件中的Grid类,或者是在应用程序中自己定义的Grid
类。为了弄明白,解析器会检查XML命名空间
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
前者是Windows Phone核心命名空间,包好了大部分用来构建用户界面的控件类。在代码中,该名称空间没有使用
命名空间前缀,所以它成为整个文档的默认命名空间,因此,代码中没有前缀的元素都自动位于该命名空间下。
后者是XAML命名空间,包含各种XAML使用特性,这些特性影响着文档的解释方式。该名称空间被映射为前缀x。这
就意味着通过在元素名称之前放置名称空间前缀x来使用该命名空间。
如下面代码中的x:Name,x:Key等等。至于
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
代表的含义也就可以解释了。