第1章 XAML 概览
《深入浅出 WPF》本书的内容分为两大部分。第一部分是学习 WPF 开发的基础知识,包括 XAML 语言的详细剖析、WPF 控件的使用、用户界面布局的介绍。第二部分是作为优秀 WPF 程序员
所应掌握的知识,包括依赖对象和数据关联、路由事件与命令、数据模板与控件模板、绘图与动画等。本节为大家介绍 XAML 是什么。
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。