1.1 WPF应用程序的创建
在Windows操作系统中,所有的应用程序都在自己独立的进程中运行,WPF也不例外。每个进程都有自己独立的内存地址,进程间的数据是隔离的,进程之间不会相互影响。当应用程序创建进程时,同时创建一个或多个线程。线程在自己的进程空间中运行,在底层,WPF仍然使用Windows的消息驱动机制来实现事务处理。
创建WPF应用程序从创建Application类开始。WPF的主要功能是人机交互,我们可以把当代人机界面(UI)程序归为两大类:一类是桌面(desktop)应用程序;一类是互联网(Web)应用程序。WPF首次实现了对这两类应用程序的统一编程。
让我们来创建一个简单的WPF程序:
using System; using System.Windows; namespace Yingbao.Chapter1 { public class HelloWPF { [STAThread] public static void Main() { Window win = new Window(); win.Title = "WPF application"; win.Content = "Hello WPF!"; win.Show(); Application app = new Application(); app.Run(); } } }
首先,用Yingbao.Chapter1声明命名空间,并将在本书的所有例程中使用这一惯例。第1章的例程在Yingbao.Chapter1的命名空间中,第2章的例程将在Yingbao. Chapter2的命名空间中等。
然后,引入了.NET中的两个命名空间: System和System.Windows。 System命名空间提供.NET的基本服务,System.Windows中含有WPF的基本服务。Microsoft把WPF所用的类,都放在System.Windows的命名空间或其下面的命名空间中,如System.Windows.Controls、System.Windows.Input,等等。在Visual Studio的项目下,引入相应的Assembly, 这样就可以使用这些命名空间中的类了。
Main函数是WPF程序的入口点,它必须是静态(static)的。所有WPF程序,都必须在单一线程公寓(STA)模型中运行。STA来源于COM,若对此概念不熟悉,可以参考COM的相关著作或文章。在Main函数前加上STAThread属性,就是满足WPF的这一要求,即UI不能在多线程的环境中运行。
在这个程序里,创建了一个Window类实例; Window类是管理WPF桌面应用程序的窗口类。其Title属性就是窗口标题,而Content属性是窗口中所要显示的内容。和.NET 1.0中的Form显示窗口一样,需要调用Show()方法,最后创建了Application类实例,并调用其Run() 方法。Run() 方法创建了和Win32一样的消息分配机制,它会接收操作系统发给应用程序的消息,并对相关消息进行响应。这个程序的运行结果如图1-1所示。
图1-1 Hello WPF!
你也可以不用调用Window类中的Show方法,而使用更为简洁的形式:
app.Run(win);
在这种情况下,Run方法将会自动调用win.Show()。