WPF之What & Why
自古以来,生产工具就代表着生产力的先进程度--生产力的发展要求人们不断研发出新的生产工具,新生产工具的诞生又使生产效率出现飞跃。作为劳动生产的一种,计算机软件开发也需要工具,随着程序员们手中的工具越来越强大,软件开发的效率和质量也越来越高。善于学习和掌握新工具、新技术的程序员们也总是能得到更多的实惠。
微软Windows操作系统成功推出已有十多年,在Windows系统平台上从事图形用户界面(Graphic User Interface,GUI)程序开发的程序员数不胜数。GUI程序员们手中的开发工具历经了Win32 API→MFC(及同类产品)→ActiveX/COM/Visual Basic→Windows Forms的变迁,每一次变迁都使开发效率和质量产生飞跃。从2007年开始,微软推出了它的新一代GUI开发工具Windows Presentation Foundation(直译为Windows表示基础,WPF),并且把WPF定为未来十年Windows平台GUI开发的主要技术。时至今日,不但Windows Vista、Windows 7、Windows Server 2008、Windows Server 2008 R2等系统已经无缝集成了WPF,连Visual Studio 2010等重要产品业已使用WPF进行开发。可见微软在WPF技术方面的务实精神与决心。
什么是WPF
WPF是Windows Presentation Foundation的简称,顾名思义是专门用来编写程序表示层的技术和工具。
WPF是做什么用的呢?让我们从分析一个客户的需求开始,解答这个问题。经常会有一些朋友找我写项目,有一次,一家医疗单位的技术主管找到我说:"你能不能用WPF为我们开发一套管理系统呀?"其实,这就是一个对WPF的典型误解。误解在何处呢?主要是没有弄清WPF的功用。当今的程序,除了一些非常小巧的实用工具外,大部分程序都是多层架构的程序。一提到多层架构,一般就至少包含3层:数据层、业务逻辑层和表示层(它们的关系如图1所示)。
这3层的功能大致如下:
数据层:用于存储数据,多由数据库构成,有时候也用数据文件能辅助存储数据。比如医院的药品列表、人员列表、病例列表等都存储在这一层。
业务逻辑层:用于根据需求使用计算机程序表达现实的业务逻辑。比如哪些医生可以给哪些病人看病,从挂号到取药都有什么流程,从住院到出院有哪些流程,都可以由这层来实现。这一层一般会通过一组服务(Service)向表示层公开自己的各个功能。因为这一层需要与数据层进行交互,所以经常会划分出一个名为"数据访问层"(Data Access Layer,DAL)的子层专门负责数据的存取。
![](http://silverlightchina.net/uploads/allimg/111026/20435TT6-0.jpg)
表示层:负责把数据和流程展示给用户看。对于同一组来自业务逻辑层的数据,我们可以选择多种表达方式。比如对于同一张药品单,如果想以短信的形式发送给药房,可以以一串字符的形式来表达;如果客户想打印药品单的详细内容,可以以表格的形式来表达;如果客户想直观地看到每种药品占总价格的比例,我们可以使用饼图来表达。除了用于表示数据,表示层还负责展示流程、响应用户操作等。而且,表示层程序并不拘泥于桌面程序,很多表示层程序都运行在手机或浏览器里。表示层程序也常被称为客户端程序。
WPF的功能就是用来编写应用程序的表示层,至于业务逻辑层和数据层的开发也有专门的新技术。比如业务逻辑层的新技术是WCF(Windows Communication Foundation)和WF(Windows Workflow Foundation)。微软平台上用于开发表示层的技术不算少,包括WPF、Windows Forms、ASP.NET、Silverlight等。换句话说,无论使用哪种技术作为表示层技术,程序的逻辑层和数据层都是相同的。所以"使用WPF开发管理系统"这个提法是不对的。
WPF与Silverlight的关系
目前,.NET开发人员学习WPF的回报是相当高的,原因是几乎整个微软新一代开发框架都能看到WPF的影子。微软的新一代开发技术框架包括Windows Presentation Foundation(WPF)、Windows Communication Foundation(WCF)和Windows Workflow Foundation(WF,据说因为与World Wildlife Fund的缩写WWF冲突了,所以去掉了一个W)。本书无疑是讲WPF,而WCF的用途是编写分布式应用程序的业务逻辑层,并以网络服务的形式暴露给客户端的服务消费者,基于WCF和Entity Framework的WCF Data Service和WCF RIA Service是微软迄今最佳的数据访问层,而这一数据访问层的最佳消费者就是WPF和Silverlight。所以,学习WPF技术可以为WCF 的学习锦上添花。WF的主要作用是设计工作流,而设计工作流的编程语言正是WPF中的界面设计语言--XAML,也就是说,学习完WPF,WF也会了一小半。
如果说学会WPF后WF算是会了一小半,那么学习完WPF后,Silverlight可以算是会了80%,为什么这么说呢?因为微软原本就定义Silverlight是WPF的一个子集、是WPF的"网络版"(Silverlight的开发代号是WPF/E,意为WPF简化版)。为了让WPF在浏览器里跑起来,微软所做的事情就是在技术理念不变的情况下对WPF进行"瘦身"--去掉一些不常用的功能、简化一些功能的实现,对多组实现同一目的的类库进行删减、只保留一组,再添加一些网络通信的功能。通过下表,我们就能看到Silverlight与WPF的技术重叠率之高:
![](http://silverlightchina.net/uploads/allimg/111026/20435V204-1.png)
如今Silverlight炙手可热的另一个原因是微软新一代手机平台Windows Phone 7也采用它来作为开发平台(此前的Windows Mobile系统使用的是简化版的Windows Forms开发平台)。Windows Phone 7中运行的Silverlight与浏览器中运行的Silverlight别无二致,因此学习完WPF之后连手机平台上的程序也会写了。
所以说学习WPF是"一本万利"的投资,一点也不过分。
为什么要学习WPF
有的朋友会问:既然已经有这么多表示层技术,为什么还要推出WPF技术呢?我们花精力学习WPF技术有什么收益和好处呢?这个问题可以从两方面来回答。
首先,只要开发表示层程序就不可避免地要与4种功能性代码打交道,它们分别是:
数据模型:现实世界中事物和逻辑的抽象。
业务逻辑:数据模型之间的关系与交互。
用户界面:由控件构成的、与用户进行交互的界面,用于把数据展示给用户并响应用户的输入。
界面逻辑:控件与控制之间的关系与交互。
这4种代码的关系如图2所示。
![](http://silverlightchina.net/uploads/allimg/111026/20435T015-2.jpg)
在保持代码可维护性的前提下,如何让数据能够顺畅地到达界面并灵活显示,同时方便地接收用户的操作历来都是表示层开发的核心问题。为此,人们研究出了各种各样的设计模式,其中有经久不衰的MVC(Model-View-Controler)模式、MVP(Model-View-Presenter)模式等。在WPF出现之前,Windows Forms、ASP.NET(Web Forms)等技术均使用"事件驱动"理念,这种由"事件→订阅→事件处理器"关系交织在一起构成的程序,尽管可以使用MVC、MVP等设计模式,但一不小心就会使界面逻辑和业务逻辑纠缠在一起,造成代码变得复杂难懂、bug难以排除。而WPF技术则是微软在开发理念上的一次升级--由"事件驱动"变为"数据驱动"。
事件驱动时代,用户每进行一个操作用会激发程序发生一个事件,事件发生后,用于响应事件的事件处理器就会执行。事件处理器是一个方法(函数),在这个方法中,程序员可以处理数据或调用别的方法,这样,程序就在事件的驱动下向前执行了。可见,事件驱动时代的数据是静态的、被动的;界面控件是主动的、界面逻辑与业务逻辑之间的桥梁是事件。而数据驱动正好相反,当数据发生变化时,会主动通知界面控件、推动控件展示最新的数据;同时,用户对控件的操作会直接送达数据,就好像控件是"透明"的。可见,在数据驱动理念中,数据占据主动地位、控件和控件事件被弱化(控件事件一般只参与界面逻辑,不再染指业务逻辑,使程序复杂度得到有效控制)。WPF中,数据与控件的关系就是哲学中内容与形式的关系--内容决定形式所以数据驱动界面,这非常符合哲学原理。数据与界面之间的桥梁是数据关联(Data Binding),通过这个桥梁,数据可以流向界面,再从界面流回数据源。
简而言之,WPF的开发理念更符合自然哲学的思想(除了Data Binding之外,还有Data Template和Control Template等,本书都将着力描述)。使用WPF进行开发较之Windows Forms开发要简单,程序更加简洁清晰。
其次,微软已经把WPF的理念扩展到了几乎全部开发平台,包括桌面平台、浏览器平台和手机平台。WPF的完整版可用于在Windows平台上开发桌面应用程序(这些桌面应用程序也可以运行在浏览器中);WPF的"简化版",也就是Silverlight,不但可以用于编写运行在浏览器中富客户端程序(Rich Internet Application),也可以用于编写运行于微软最新手机平台Windows Phone 7中的程序。所有这些程序的开发理念都是一样的,仅在类库方面有细微的差别,也就是说,学会WPF开发,Silverlight开发和Windows Phone 7开发均可触类旁通。所以学习WPF的发展前景非常好、回报很大,投入些精力是非常值得的。
最后,为大家提供一个微软官方集动画和效果为一体的实例,photoSuru。下载地址是:http://windowsclient.net/appfeeds/SubscriptionCenter/Gallery/photosuru.aspx。