俗话说,工欲善其事必先利其器。在开始利用XAML开发WPF程序之前,我们最希望的应该是一个强大的WPF开发工具。在本章中,将介绍创建和运行一个XAML程序所必须的软件环境,而后对一个XAML工程的基本结构进行详细的说明,最后就是如何编译和运行一个WPF程序。 

  注意,本章需要的知识点虽然不是很复杂,但是仍然需要您具备一些ASP.NET或HTML方面的基础知识,这样在对XAML的学习和理解方面才不至于太困难。

  运行XAML所需的软件环境

  虽然XAML是专门为Vista操作系统设计的,但是我们也可以在Windows XP和Windows Server 2003上使用它。这样使得就算Vista操作系统还没有正式发布,开发人员也可以在Windows XP和Windows Server 2003上对XAML和Microsoft Windows SDK进行预先的学习。

  下面是各个可以使用XAML的操作系统版本:

  1. Windows XP SP2
  2. Windows Server 2003 SP1
  3. Vista

  在Windows XP SP2和Windows Server 2003 SP1的操作系统上,我们首先要安装.NET Framework 3.0,它在.NET Framework 2.0的基础上还添加了对WPF、WCF、WF和CardSpace等诸多功能的支持。但是无论是使用的是何种操作系统,您都必须安装Microsoft Windows SDK,在该软件开发包中,它包含使用XAML设计用户界面时所需的类库、工具以及一系列的开发文档和代码示例。
   如果你打算使用WinFX Extensions to Visual Studio 2005来开发XAML和WPF程序,那么你需要在安装Microsoft Windows SDK前安装Visual Studio 2005。为此它的正确安装顺序为:

  1. .NET Framework 3.0
  2. Visual Studio 2005
  3. Microsoft Windows SDK
  4. WinFX Extensions to Visual Studio 2005

  最后在Visual Studio 2005中通过"文件"-"新建项目"命令,在弹出的"新建项目"对话框中有一个项目类型列表,选择Window(WinFX),这样我们就可以使用这些模板来开发相应类型的WPF程序了。如下图所示:
  定义一个XAML程序

  在这里我们就先不使用WinFX Extensions to Visual Studio 2005来构建一个包含XAML代码的WPF程序了,因为它包含了一些自动生成的XAML代码,为了循序渐进地学习XAML的基础语法和规则,在本小节中就用记事本来开发一个简单的包含XAML的WPF程序。

  一般来说,我们通常是将一个WPF的代码分别存放在两个不同类型的文件中。例如.xaml页面文件用来保持为该WPF程序构建的用户界面代码,而代码后置文件.xaml.cs则用来保存应用程序逻辑和事件处理代码。虽然XAML没有提供一个实现事件处理的机制,但是它可以直接通过执行引擎调用用C#或者VB.NET编写的事件处理方法。如果您是一个开发人员,或许你专注的只是应用程序逻辑和事件处理程序的开发。但是在该WPF程序中界面代码和程序逻辑是分离的,所以你必须和其它的设计人员进行良好的沟通,使得你可以确切地知道事件处理方法的名称和程序所引用的元素名称(事件处理方法的名称和元素名称都是在XAML文件中指定的)。

  提示:你可以完全使用C#或VB.NET来定义一个XAML程序,在前面我们讲过,所有的XAML元素都是代表一个WPF类,因此你可以通过代码的方式去实现XAML的界面设计。但是XAML可以将应用程序的呈现层完全和程序逻辑分离开来,为此就使得设计人员和开发人员可以更加专注于自己的领域,而在需要修改界面元素或程序逻辑时互不影响。

  XAML页面文件通常包含两种类型的元素,一种就是用来构建用户界面的元素,另外一种则是应用程序元素。而Application就是一个常用的应用程序元素。我们在使用Visual Studio 2005开发一个ASP.NET站点时通常会使用图1的方式,将某个页面设置为起始页。而在一个WPF程序中,我们可以使用Application元素指定在该WPF程序启动时,首先执行那个XAML页面文件。为此,在我们手动创建一个WPF程序时,首先要编写的就是应用程序定义文件。下面是一个名为MyApp的应用程序定义文件,其代码如下:

  MyApp.xaml:

01 <Application
02 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
03 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
04 StartupUri="Page1.xaml">
05 </Application>

  在上述的应用程序定义文件中,我们设置了两种类型的属性,分别为命名空间和StartupUri,StartupUri属性就是用来指定应用程序开始时所要加载的起始XAML文件。
  定义一个XAML程序

  在这里我们就先不使用WinFX Extensions to Visual Studio 2005来构建一个包含XAML代码的WPF程序了,因为它包含了一些自动生成的XAML代码,为了循序渐进地学习XAML的基础语法和规则,在本小节中就用记事本来开发一个简单的包含XAML的WPF程序。

  一般来说,我们通常是将一个WPF的代码分别存放在两个不同类型的文件中。例如.xaml页面文件用来保持为该WPF程序构建的用户界面代码,而代码后置文件.xaml.cs则用来保存应用程序逻辑和事件处理代码。虽然XAML没有提供一个实现事件处理的机制,但是它可以直接通过执行引擎调用用C#或者VB.NET编写的事件处理方法。如果您是一个开发人员,或许你专注的只是应用程序逻辑和事件处理程序的开发。但是在该WPF程序中界面代码和程序逻辑是分离的,所以你必须和其它的设计人员进行良好的沟通,使得你可以确切地知道事件处理方法的名称和程序所引用的元素名称(事件处理方法的名称和元素名称都是在XAML文件中指定的)。

  提示:你可以完全使用C#或VB.NET来定义一个XAML程序,在前面我们讲过,所有的XAML元素都是代表一个WPF类,因此你可以通过代码的方式去实现XAML的界面设计。但是XAML可以将应用程序的呈现层完全和程序逻辑分离开来,为此就使得设计人员和开发人员可以更加专注于自己的领域,而在需要修改界面元素或程序逻辑时互不影响。

  XAML页面文件通常包含两种类型的元素,一种就是用来构建用户界面的元素,另外一种则是应用程序元素。而Application就是一个常用的应用程序元素。我们在使用Visual Studio 2005开发一个ASP.NET站点时通常会使用图1的方式,将某个页面设置为起始页。而在一个WPF程序中,我们可以使用Application元素指定在该WPF程序启动时,首先执行那个XAML页面文件。为此,在我们手动创建一个WPF程序时,首先要编写的就是应用程序定义文件。下面是一个名为MyApp的应用程序定义文件,其代码如下:

  MyApp.xaml:

01 <Application
02 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
03 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
04 StartupUri="Page1.xaml">
05 </Application>

  在上述的应用程序定义文件中,我们设置了两种类型的属性,分别为命名空间和StartupUri,StartupUri属性就是用来指定应用程序开始时所要加载的起始XAML文件。
 图1 ASP.NET中设置起始页的方法
  在XAML中,每个元素都是代表一个相应的WPF类,并且元素的各个属性也是对应类的属性。惟一的例外就是xmlns和xmlns:x两个属性,它们指定了该XAML页面文件所使用的默认命名空间,而不是某个类的属性。通常我们在应用程序定义文件中设置好这两个命名空间作为WPF程序引用的默认命名空间,如果不做这样设置的话,那么你必须为应用程序定义文件中的所有XAML每个元素都指定相同的两个xmlns和xmlns:x属性,这和我们在C#中使用using关键字来引用命名空间是类似的。为了减少重复且冗长的输入,我们最好是在应用程序定义文件事先设置好这些默认的命名空间。但是有一种情况除外,那就是使用的是自己命名空间中所定义的元素,在这种情况下,可以将自定义元素的xmlns和xmlns:x属性指定为自身的命名空间。在本文的所有代码示例中,都将在根元素中引用上述的两个默认命名空间,当然你也可以对根元素中的所有元素都指定命名空间,但是这种方式是不推荐的,因为这样不但繁杂,而且使得XAML页面代码冗长。

  在任何一个XAML页面文件中首先声明的元素就是前面我们所提及的根元素,每个根元素最好都引用默认的命名空间,在目前版本的WPF程序中,所以的根元素引用的都是下面的两个命名空间:

  http://schemas.microsoft.com/winfx/2006/xaml/presentation
  http://schemas.microsoft.com/winfx/2006/xaml

  提示:为什么说目前的WPF程序引用的是上述的两个命名空间呢?这是因为到Vista正式发布时,这两个命名空间的名称可以会发生变化,在以前的CTP版本中,WPF程序引用的命名空间名称为http://schemas.microsoft.com/winfx/avalon/2005。

  在根元素中可以包含其它的XAML元素。在应用程序定义文件中的最常用的就是Application元素,而且根据你所创建的是Windows应用程序还是Browser应用程序,分别使用特定的Windows和Page作为XAML文件的根元素。

  在代码2-1中,我们在根元素Application指定了该程序执行时首先加载的XAML页面文件,在上述示例中,StartupUri的属性值为"Page1.xaml",下面我们就来创建Page1.xaml,该文件包含了用户界面的实际定义,就像其它的XAML页面文件一样,我们需要为该文件使用一个根元素。其完整的XAML页面代码如下:

  Page1.xaml

01 <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
02 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
03 <StackPanel>
04 <TextBlock>Hello World</TextBlock>
05 <Button Width="100">Click Me</Button>
06 </StackPanel>
07 </Page>

  在上述程序代码中,我们在第1行代码处设置了XAML页面文件的根元素为Page,这说明了该WPF程序将使用浏览器进行呈现。第3行代码使用了StackPanel元素,它是用来包含其它的XAML元素的一个容器,功能和它类似的还有DockPanel元素,我们将在后续的学习过程中详细介绍这两个元素,现在你使要知道的就是它们是一个用来包含其它XAML元素的容器元素即可。第4行代码中使用的是TextBlock,这个元素和ASP.NET的Label空间非常类似,用来显示一段文本信息。将这段代码粘贴到XAMLPad中,其显示的效果如下:
  这是一个及其简单的XAML页面文件,除了一些必要的属性外,我们并没有进行其它的一些额外设置,例如对该页面应用样式、布局等,对于这些信息的使用方法将在后续直接进行介绍。在这一节中我们只需关注如何创建一个最简单的应用程序定义文件和XAML页面文件即可。现在我们已经创建了MyApp,xaml和Page1.xaml这两个XAML文件,那么通过什么样的方法才能编译这些文件,并执行最终的可执行文件呢?具体的实现过程将在下一节中进行介绍。