如果我们使用Visual Studio
来开发一个XAML程序
那与上述的手动创建XAML程序过程来说是相对便捷的
你可以直接选择一个WinFX模板来创建特定类型的WPF程序
Visual Studio会自动为该WPF程序创建相应的项目文件和应用程序清单
现在我们可以创建的WPF程序类型有如下的四种
WinFX Wndows Application
WinFX Web Browser Application
WinFX Service Library
WinFX Customer Control Library
然而针对WinFX开发的Visual Studio版本还没有正式推出所以Visual Studio 缺乏对WinFX程序开发这方面的一些完善支持为此要编辑XAML和相应的代码后置文件(xamlcs)时有时还是需要开发人员手动地进行编辑
在这里假设你已经安装好了运行XAML所需的软件环境现在我们来使用Visual Studio 创建一个WPF程序至于是选择WinFX Wndows Application模板还是WinFX Web Browser Application模板取决于你所要创建的是宿主于浏览器的程序还是窗体程序现在我们在新建项目对话框中的WinFX Web Browser Application模板输入该WPF程序的项目名称并选择好程序保存在硬盘上的位置点击确定按钮Visual Studio就自动为该WPF程序生成默认的XAML和代码后置文件
提示无论你是否使用Visual Studio在创建一个WinFX Wndows Application和一个WinFX Web Browser Application时各自的xaml文件代码还是存在一些细微差别的在一个Browser Application中默认起始页的根元素为Page而一个Wndows Application中默认起始页的根元素为Window而Window类是无法在Browser Application中使用的这是因为运行在浏览器中的WPF程序是在部分信任的沙箱内操作(沙箱能够防止客户端计算机受到恶意应用程序的侵害)为此它没有打开一个新Windows窗体的权限
在解决方案资源管理器窗口中可以看到Visual Studio为当前WPF程序所自动生成的XAML和代码后置文件由于在Visual Studio中会自动生成相应的项目文件使用我们不必详细了解该Browser Application在生成时其底层的实现细节但是由于WPF程序和应用程序定义文件和相关的XAML页面文件戚戚相关为此最好还是详细了解下各个文件的具体内容下面我们通过双击解决方案资源管理器中的文件图标打开相应的文件在默认状态下一个xaml文件存在三个试图方式分别为设计试图XAML试图和源码试图如果要查看相应的XAML代码的话你可以点击XAML按钮切换到XAML试图状态下这是打开应用程序定义文件Appxaml的相应界面
点击XAML试图按钮后Appxaml页面对应的XAML代码如下
<Application x:Class=BrowserDemoApp
xmlns=
xmlns:x=
StartupUri=Pagexaml
>
<ApplicationResources>
</ApplicationResources>
</Application>
在第行代码处我们可以看到在应用程序定义文件中我们使用了Application元素并且用x:Class 属性指定了一个与之关联的C#不完全类(后一个程序清单的第行代码所示)而后在程序编译时会自动将应用程序定义文件和包含关联C#不完全类的代码后置文件这两部分结合在一起从而创建一个完整的BrowserDemo命名空间下的App类注意BrowserDemoApp类是从WPF提供的SystemWindowsApplication类中派生的第行代码使用了StartupUri属性为该WPF程序指定首次运行程序时要加载的XAML页面文件在一个Browser Application类型的WPF程序中我们可以添加多个XAML页面并支持在这些页面间进行跳转和切换
提示
而Appxamlcs的代码如下(可以通过Appxaml页面的Source按钮切换到源码试图)
using System;
using SystemWindows;
using SystemWindowsNavigation;
using SystemData;
using SystemXml;
using SystemConfiguration;
namespace BrowserDemo
{
/// <summary>
/// Interaction logic for Appxaml
/// </summary>
public partial class App : Application
{
}
}
Pagexaml页面对应的XAML代码如下
<Page x:Class=BrowserDemoPage
xmlns=
xmlns:x=
Title=Page
>
<Grid>
</Grid>
</Page>
我们在第行代码处用x:Class属性指定的BrowserDemoApp类是从WPF提供的SystemWindowsApplication类中派生的并且用属性Title指定了该页面在呈现时的标题第行代码使用了一个Grid元素微软推荐开发人员使用该元素来布局XAML页面上的各个界面元素这是因为Grid元素在定位页面上的各个元素方面有着极大的灵活性至于该元素的具体用法将在本章的后续章节进行介绍
using System;
using SystemCollectionsGeneric;
using SystemText;
using SystemWindows;
using SystemWindowsControls;
using SystemWindowsData;
using SystemWindowsDocuments;
using SystemWindowsInput;
using SystemWindowsMedia;
using SystemWindowsMediaImaging;
using SystemWindowsNavigation;
using SystemWindowsShapes;
namespace BrowserDemo
{
/// <summary>
/// Interaction logic for Pagexaml
/// </summary>
public partial class Page : Page
{
public Page()
{
InitializeComponent();
}
}
}现在我们在这个Browser Application的Pagexaml页面上添加一个按钮并对该按钮的单击事件添加一个事件处理方法以显示信息首先我们在工具箱上拖拽一个Button控件切换到XAML视图后你会发现在<Grid>…</Grid>两元素之间添加了一个Button元素我们可以设置其相应的属性最终Pagexaml的代码如下
<Page x:Class=BrowserDemoPage
xmlns=
xmlns:x=
Title=Page
>
<Grid>
<Button Height= Width= FontSize= Background=Aqua
Name=MyButton Content=Click Me Click=ChangeMe >
</Button>
</Grid>
</Page>
由于要处理按钮的单击事件为此我们要编写相应的事件处理方法其代码如下
void ChangeMe(object sender
RoutedEventArgs eventArgs)
{
count++;
MyButtonContent = You have clicked + count + times!;
}
如上述的代码所示我们每点击一次按钮都会导致该按钮上显示的内容发生改变(每次count的值都自增)
而事件处理代码我们一般是在XAML页面对应的代码后置文件中进行编写我们将事件处理代码要添加到Pagexaml页面的代码后置文件Pagexamlcs中改变后的代码如下
using System;
using SystemCollectionsGeneric;
using SystemText;
using SystemWindows;
using SystemWindowsControls;
using SystemWindowsData;
using SystemWindowsDocuments;
using SystemWindowsInput;
using SystemWindowsMedia;
using SystemWindowsMediaImaging;
using SystemWindowsNavigation;
using SystemWindowsShapes;
namespace BrowserDemo
{
/// <summary>
/// Interaction logic for Pagexaml
/// </summary>
public partial class Page : Page
{
int count = ;
public Page()
{
InitializeComponent();
}
void ChangeMe(object sender RoutedEventArgs e)
{
count++;
MyButtonContent = You have clicked + count + times!;
}
}
}
我们在第行定义了一个名为count的变量并初始化其值为在第行代码处是Button按钮的事件处理方法这里的事件处理方法名ChangeMe就是由Pagexaml中的Button元素的Click指定的因为在一个WPF程序中可能包含若干个Button元素所以你可以在XAML文件用Name属性为该Button元素指定一个惟一的名称这里为MyButton以后在对应的代码后置文件中应用该Button元素时就不用再对这个元素进行声明了并且在编译时Button元素的声明和相应的事件处理方法将合并到同一个类中这里为BrowserDemoPage
提示在添加了元素和相应的处理方法逻辑后我们就可以采用和以前类似的用Visual Studio生成NET应用程序的方式来生成WPF程序也就是说我们可以使用Visual Studio菜单上的生成-生成XX(XX为项目名)命令来编译程序编译完毕后就可以对该程序进行测试调试和部署
保存文件的最后一次改动后再使用启动调试按钮生成该Browser Application程序最后得到的呈现效果如下
下图是点击按钮次后的显示效果
上述的整个实现过程对于NET开发人员来说应该是非常熟悉的因为XAML页面有点类似于ASPNET中的Web窗体都是用来构建程序的界面布局而XAML页面对应的代码后置文件则等类似于ASPNET中用来处理事件和用户请求信息的服务器端代码
我们在前面提及过使用Visual Studio来创建一个WPF程序时无需开发人员编写项目文件而且也不用考虑微软新一代统一生成平台MSBuild的运作方式上述的这些必需的文件都会由Visual Studio自动给开发人员生成你仅需考虑WPF程序中的应用程序定义文件和XAML页面文件即可