1.1 XAML是什么
自人类社会诞生,社会分工就在不断地进行着。从原始社会畜牧业与农业分离到当今数以万计行业的存在,无不是社会分工的杰作。社会分工的意义在于它能使从事固定工作的人群更加专业化,并通过合作的形式提高生产效率。换句话说,在合作不是问题的情况下,若干群专业人士配合工作要比同等数量的一群"大而全"人士的工作效率高。
这种分工与合作的关系不仅存在于行业之间,也存在于行业内部。软件开发中最典型的分工合作就是设计师(Designer)与程序员(Programmer)之间的协作。在WPF出现之前,协作一般是这样展开的:
(1)需求分析结束后,程序员对照需求设计一个用户界面(User Interface,UI)的草图,然后把精力主要放在实现软件的功能上。
(2)与此同时,设计师们对照需求、考虑用户的使用体验(User Experience,UX)、使用专门的设计工具(比如Photoshop)设计出优美而实用的UI。
(3)最后,程序员按照设计师绘制的效果图,使用编程语言实现软件的UI。
经验告诉我们,即便是优秀的设计师团队和优秀的开发团队合作,花费在沟通和最终整合上的精力也是巨大的。经常出现的问题有:
设计师的设计跟不上程序逻辑的变化。
程序员未能完全实现设计师提供的效果图。
效果图与程序功能不能完全匹配。
从效果图到软件UI的转化耗费很多时间。
这些并不是谁对谁错的问题--只要存在分工,合作的成本就不可能为零。问题的核心在于,设计师与程序员的合作是"串行"的,即先由设计师完成效果图、再由程序员通过编程实现。如果设计师能与程序员"并行"工作并直接参与到程序的开发中来,上述问题就解决了。
解决方案是什么呢?是让设计师们使用编程语言来设计UI效果图,还是让程序员们使用Photoshop来开发程序?显然都行不通。
网络程序开发团队的经验倒是很值得借鉴:草图产生后,设计师们可以使用HTML、CSS、JavaScript直接生成UI,程序员则在这个UI产生的同时实现它背后的功能逻辑。在这个并行的合作中,设计师们可以使用Dreamweaver等设计工具,程序员使用Visual Studio来进行后台编程。有经验的设计师和程序员往往还具备互换工具的能力,使得他们能基于HTML+CSS+JavaScript这个平台进行有效的沟通。
为了把这种开发模式从网络开发移植到桌面开发和富媒体网络程序的开发上,微软创造了一种新的开发语言--XAML(读作zaml)。XAML的全称是Extensible Application Markup Language,即可扩展应用程序标记语言。它在桌面开发及富媒体网络程序的开发中扮演了HTML+CSS+ JavaScript的角色、成为设计师与程序员之间沟通的枢纽。
现在,设计师和程序员们一起工作、共同维护软件的版本,只是他们使用的工具不同--设计师们使用Blend(微软Expression设计工具套件中的一个)来设计UI,程序员则使用Visual Studio开发后台逻辑代码。Blend使用起来很像Photoshop等设计工具,因此可以最大限度地发挥出设计师的特长。使用它,设计师不但可以制作出绚丽多彩的静态UI,还可以让UI包含动画--虽然程序员们也能做出这些东西,但从专业性、时间开销以及技术要求上显然是划不来的。更重要的是,这些绚丽的UI和动画都会以XAML的形式直接保存进项目,无需转化就可以直接编译,节省了大量的时间和成本。
1.2 XAML的优点
前面一节已经向我们透露了XAML的几个优点:
XAML可以设计出专业的UI和动画--好用。
XAML不需要专业的编程知识,它简单易懂、结构清晰--易学。
XAML使设计师能直接参与软件开发,随时沟通、无需二次转化--高效。
然而,XAML这位翩翩君子的才华可远不止这些。
自从应用程序从控制台界面(Console User Interface,CUI)升级为图形用户界面(Graphic User Interface,GUI)后,程序员们就一直追求将视图(View,也就是UI)与逻辑代码的分离。以往的开发模式中,程序员很难保证用来实现UI的代码完全不与用来实现程序逻辑的代码纠缠在一起。UI代码与逻辑代码纠缠在一起称为UI与逻辑的紧耦合,它往往带来以下的后果:
无论是软件的功能还是UI设计有所变化或者是出了bug,都将导致大量代码的修改。
会让逻辑代码更加难以理解--修改往往比重写更困难,因为在修改之前必须先读懂。
重用逻辑代码变成了Mission Impossible。
XAML另一个巨大的优点就是:它帮助开发团队真正实现了UI与逻辑的剥离。XAML是一种单纯的声明型语言,也就是说,它只能用来声明一些UI元素、绘制UI和动画(在XAML里实现动画是不需要编程的),根本无法在其中加入程序逻辑,这就强制地把逻辑代码从UI代码中赶走了。这样,与UI相关的元素统统集中在程序的UI层、与逻辑相关的代码统统集中在程序逻辑层,形成了一种"高内聚-低耦合"的结构。形成这种结构后,无论是对UI进行较大改动还是打算重用底层逻辑,都不会花费太大力气。这就好比有一天你给A客户做了一个橘子,A客户很喜欢;A客户把你的产品介绍给了B客户,B客户很喜欢橘子味道,但希望它看上去像个香蕉--这时候,你只需要把橘子皮撕下来、换一套香蕉皮即可。只需很少的成本就可以获得与先前一样大的收益(对于软件的"换肤"行为,WPF提供了丰富的Template功能,将在后面详述)。