WPF - 第二章 XAML

XAML(Extensible Apllication Markup Language 的简写)是用于实例化.NET对象的标记语言。尽管XAML是一种可用于诸多不同问题领域的技术,但其主要作用是构造WPF用户界面。换言之,XAML文档定义了在WPF应用程序中组成串口的面板、按钮以及各种控件的布局。

子集

  • WPF XAML包含描述WPF内容的元素,如矢量图形、控件以及文档
  • XPS XAML是WPF XAML的一部分,它为格式化的电子文档定义了一种XML表示方式
  • Silverlight是一个用于Mircrosoft Silverlight应用程序的WPF XAML子集。Silverlight是一个跨平台的浏览器插件,通过它可船舰具有二位图形、动画、音频和视频的富Web内容
  • WF XAML包括描述WF(Work Flow,工作流)内容元素

XAML编译

WPF的创建者知道,XAML不仅要能够解决设计协作问题,它还需要快速运行。尽管基于XML的格式可以很灵活并且很容易迁移到其他工具和平台,但他们未必是最有效的选择。XML的设计目标是具有逻辑性、易读而且简单,没有被压缩。

WPF使用BAML(Binary Application Markup Language)来客服这个缺点。BAML并非新事物,它实际上就是XAML的二进制表示。当在Visual Studio中编译WPF应用程序时,所有XAML文件都被转换为BAML,这些BAML然后作为资源被嵌入到最终的DLL或EXE程序集中。BAML时标记化的,这意味着较长的XAML被较短的标记替代。BAML不仅明显小一些,还对其进行优化,从而使它在运行时能够快速解析。

XAML基础

  • XAML 文档中的每个元素都映射为.NET类的一个实例。元素名称也完全对应于类名。例如,元素<Button>指示创建Button对象。
  • 与所有XML文档以盐给,可在一个元素中嵌套另一个元素。您在后面将看到,XAML让每个类灵活地决定如何处理嵌套。但嵌套通常时一种表示“包含”的方法——换句话说,如果在一个Grid元素中发现一个Button元素,那么永华界面可能包括一个在其内部包含一个Button元素的Grid元素。
  • 可通过特性设置每个类的属性。但在某些情况下,特性不足以完成这项工作。对于此类情况,需要通过特殊的语法使用嵌套的标签

XAML文档基本框架

WPF - 第二章 XAML

该文档仅含有两个元素——顶级的Window元素以及一个Grid元素,Window元素代表 整个窗口,在Grid元素中可以放置所有控件。尽管可使用任何顶级元素,但时WPF应用程序只使用以下几个元素作为顶级元素:

  • Window元素
  • Page元素(该元素和Window元素类似,但它用于可导航的应用程序)
  • Application元素(该元素定义应用程序资源和启动设置)

与在所有XML文档中一样,在XAML文档中只能有一个顶级元素。在上例中,这意味着是要使用</Window>标签关闭了Window元素,文档就结束了。在后面不能再由任何内容。

查看Window元素的开始标签,将法向几个有趣的特性,包括一个类名和两个XML名称空间。还会发现三个属性:Title="Window1" Height="300" Width="300"  每个特性对应Window类的一个单独属性。总之,这告诉WPF创建标题为“Window1”的窗口,并使窗口额尺寸为300*300单位

XAML名称空间

显然,只提供类名时不够的。XAML解析器还需要知道类位于那个.NET名称空间。例如,再许多名称空间中可能都有Window类——Window类可能时指System.Windows.Window类,也可能时指位于第三方组建中的Window类,或您自己再应用程序中定义的Window类等。为了弄清除实际上希望使用哪个类,XAML解析器会检查应用于元素的XML空间。

下面时该机制的工作原理。以下定义了两个名称空间

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns特性时XML中的一个特殊特性,它专门用来声明名称空间。这段标记声明了两个名称空间,再创建的所有WPF XAML文档中都会使用这两个名称空间:

  • http://schemas.microsoft.com/winfx/2006/xaml/presentation 时WPF核心名称空间。它包含了所有的WPF类,包括用来构建用户界面的控件。再该例中,该名称控件的声明没有使用名称控件前缀,所以它称为整个文档的默认名称空间。换句话说,除非另行指明,每个元素自动位于这个名称空间
  • http://schemas.microsoft.com/winfx/2006/xaml 时XAML名称空间。它包含各种XAML实用特性,这些特性可影响文档的解释方式。该名称空间被映射为前缀x。这意味着可通过再元素名称前防止名称空间前缀x来使用该名称空间

正如再前面看到的,XML名称空间的名臣和任何特定的.NET名称空间都不匹配。XAML的创建者选择这种设计的原因由两个。按照约定,XML名称空间通常时URI。这写URI看起来像时再指明Web上的位置,但实际上不是。通过使用URI格式的名称空间,不通组织就基本不会无意中使用相同的名称空间创建不同的基于XML的语言。因为schemas.com域归Mircrosoft所有,只有Microsoft会在XML名称空间的名称中使用它。

另一个原因时XAML中使用XML的名称空间和.NET名称空间不是一一对应的,如果一一对应的话,会显著增加XAML文档的复杂程度。此处的问题在于,WPF包含了十几种名称空间(所有这些名称空间都以System.Windows开头)。如果每个.NET名称空间都由不同的XML名称空间。那就需要为使用每个空间制定确切的XML名称空间,这很快就会XAML文档变得回环不堪。所以,WPF创建人员选择了这种方法,将所有这些.NET名称空间组合到单个XML名称空间中。因为在不同的.NET名称空间中都一部分WPF类,并且所有这些类名称都不相同,所以这种设计时可行的。

名称空间信息是的XAML解析器可找到正确的类。例如,当查找Window和Grid元素时,首先会查找默认情况下它们所在的WPF名称空间,然后查找相应的.NET名称空间,直至找到System.Windows.Window类和System.Windows.Controls.Grid类。

代码隐藏类

可通过XAML构造用户界面,但为了使应用程序徐具有一定的功能,就需要用与连接包含应用程序代码的事件处理程序的方法。XAML通过使用如下所示的Class特性简化了这个问题:

<Window x:Class="WindowsApplication1.Window1">

在XAML名称空间的Class特性之前放置了名称空间前缀x,这意味着这是XAML语言中更通用的部分。实际上,Class特性告诉XAM了解析器用制定的名称生成一个新类。该类继承自由XML元素命名的类。换句话说,该类创建了一个名为Window1的新类,该类继承自Window基类。