前 言感谢你购买《WPF揭秘》!为避免让你感到失望,在这里我要先澄清一下,这不是一本关于Microsoft PowerPoint的书(许多人认为WPF是由PowerPoint演化而来的) ,WPF是微软最新的图形用户界面技术,这里的用户界面可以是普通的窗体、以文档为中心 的窗口、卡通动画、视频、逼真的3D环境,或者以上所有的组合!这项技术会让创建许多类型的应用程序变得比过去任何时候都要简单。例如,WPF可以使实现类似于Windows Media Player或Microsoft Word(或者至少WordPad)的应用程序变得相对简单,当然也可以创建类似于Microsoft PowerPoint的应用程序! 自从2003年WPF公之于众开始(当时的开发代号为Avalon),其革命性的创建软件的方式引起了(理所应当的)高度关注,特别是使用Windows Forms和GDI进行开发的开发人员。创建有趣、有用、可分享的WPF示例来演示各种类型的技术并不难,而如果使用其他技术,那么它们很难实现。但从编程模型、基础概念和使用的基本术语来看,WPF与以前的技术完全不同。甚至查看WPF的源代码(我们可以用一个类似于.NET Reflector的工具来破解并打开WPF的组件)也会让人感到困惑,因为你寻找的那些代码经常不在你所期望的位置。再加上完成任何一个任务都有很多方式,和许多人一样,你会得出一个结论:WPF的学习曲线非常陡。本书于是应运而生了。5年前,我编写了.NET and COM: The Complete Interoperability Guide,因为我觉得人们需要这样一本书,完整地讲解深奥和复杂的主题。WPF推出后,很明显在市场上肯定将不会缺WPF的书。但是我并不清楚,这些书能否通过实践的方式讲解WPF,同时引导人们理解这项技术及其独特的概念。因此,我在写本书时,确立了这样的目标: 以一种实用、易懂的方式来讲解基本概念,打好扎实的基础。 解决大多数人在学习这项技术时都会遇到的问题,以及演示如何完成一些最常见的任务。 成为一本权威的参考资料,这多亏WPF团队成员的参与,是他们设计、实现并且测试了这一技术。 讲清楚这项技术的缺点,而不只是将这项技术吹嘘成能解决所有问题的灵丹妙药。 要让书中的内容很容易查找,以便经常查阅。希望你能认可本书已具备了以上这些特点。本书适合的读者 这本书是为那些对用户界面感兴趣的软件开发人员编写的。无论你是在创建企业级商务应用程序,还是面向消费者的应用程序,抑或是一些可重用的控件,本书的许多内容都可帮助你发挥平台的最大功效。它易于理解,即使对那些.NET新手们也不难。如果你已经对WPF十分熟悉,我可以很自信地告诉你,你仍然可以从本书中学到一些东西。有一点是肯定的,它是你书架上一本不可或缺的参考书。因为WPF不仅允许你创建独立的Windows应用程序,也允许你创建寄宿于Web浏览器的内容,所以任何一个想寻找Adobe Flash替代品的人都将感受到本书很有意思。虽然更轻量级的、跨平台Silverlight没有在本书中大量涉及,但书中许多概念与Silverlight中的是相同的,也适用于WPF/E。虽然本书的内容并不是为图形设计师定制的,但阅读它可以很大程度上帮助理解像Microsoft Expression Blend这样的微软产品的精髓。现在概括一下这本书的内容。 涵盖了你所需要知道的关于XAML(eXtensible Application Markup Language)的一切,它是新的基于XML的语言,可用于创建易于改变样式的声明式用户界面。 以令人难以置信的深度讲解WPF特性:控件、布局、资源、数据绑定、样式、图形、动画等。 研究许多书中没有涉及的主题,如3D、语音、音频/视频、文档、位图特效等。 演示如何创建流行的UI元素,例如Microsoft Office System 2007中介绍的特性:Gallery、ScreenTip、自定义控件布局等。 演示如何创建复杂的UI机制,例如类似于Visual Studio的可折叠(collapsible)/可停靠(dockable)的窗口。 解释如何开发、部署所有类型的应用程序,包括基于导航的应用程序、寄宿于Web浏览器的应用程序以及带有好看的非矩形窗口的应用程序。 解释如何创建顶级的WPF自定义控件。 演示如何创建混合的WPF软件,这种软件融合了Windows Forms、ActiveX以及其他一些非WPF技术。 讲解如何在WPF应用程序中利用Windows Vista的新特性,以及如何突破WPF的某些限制。本书并没有涵盖WPF的所有特性,尤其是XPS(XML Paper Specification)规范文档仅涉及了一点点。WPF的内容太多了,我不相信哪一本书能涵盖所有这些内容。但是我相信你会为本书所达到的广度和深度而感到高兴。书中的示例有用XAML和C#写的,讨论互操作性的示例是用C++/CLI写的。频繁使用XAML有许多理由:它是表示源代码最简洁的方式;它可以经常被贴入像XamlPad(在Windows SDK中可以找到这个工具)这样的工具中,在不需要编译的情况下,快速查看结果;基于WPF的工具生成的是XAML而不是过程代码;无论你使用哪种.NET语言,就算你用Visual Basic.NET而不用C#,XAML也是可用的。当XAML与C#这样的语言的映射不是很明显时,我会把示例的XAML和过程代码都呈现出来。软件要求本书针对的软件有WPF 3.0最终版、相应的Windows SDK和2006年10月发布的Visual Studio 2005 .NET Framework 3.0扩展组件。下面的软件是必需的: 支持.NET Framework 3.0的Windows系统。可以是Windows XP SP2(包括Media Center版,Tablet PC版,x64版)、Windows Server 2003 SP1(包括R2版本)、Windows Vista或之后的版本。 .NET Framework 3.0从Windows Vista开始默认就是安装的。而对于较早版本的Windows来说,你可以从
http://msdn.com免费下载 .NET Framework 3.0。我还推荐你使用下面的软件: Windows Software Development Kit (SDK),特别是包含在其中的.NET工具。这也是可以从
http://msdn.com免费下载的。 Visual Studio 2005及之后的版本,也可以是免费的Express版本,你可以从
http://msdn.com 下载该版本。如果你使用的是Visual Studio 2005(Express或其他版本),你应该从MSDN下载.NET Framework 3.0开发扩展。用Visual Studio 2005之后的版本,就不需要安装这个开发扩展。如果你需要另外的基于WPF的图形设计工具支持,Microsoft Expression将会有很大帮助。关于其他对于WPF设计和开发有用的软件请见附录。在第7章中的一些例子仅在Windows Vista下可用,但本书其他例子都是可以在Windows的任何版本中运行的。关于代码示例本书中的示例源代码可以到
www.turingbook.com本书配套网页(免费注册)或www. adamnathan.net/wpf下载。本书结构本书主要由六个部分组成,按一般的先后顺序讲解了你需要理解的WPF功能。但是如果你想跳过直奔某一个主题,如3D或者动画部分,本书也适合你做“非线性的旅行”。下面对每一部分做一个简介。第一部分:背景本书是通过比较WPF与其他技术来介绍WPF的,它帮助你决定在何时使用WPF。第2章深入探索XAML,为你接下来理解XAML打基础,这些XAML你也会在实际工作中遇到。第3章重点讲解WPF编程模型中最独特的地方,以及.NET程序员还未理解的WPF特点。 第1章:为什么使用WPF。 第2章:XAML揭秘。 第3章:WPF的重要新概念。第二部分:构建WPF应用程序第二部分将向你讲解如何集成和部署一个外观老式的Windows应用程序(虽然它也有一些奇特的效果,如变换、非矩形窗口和Aero玻璃效果)。我们从介绍WPF控件的实现开始,这些控件有些是你想要的,也有一些是你想不到的。接下来两个章节讲解了如何在用户界面上排布这些控件(以及其他元素)。最后第7章通过讲解如何用不同的方式来采用基于WPF的用户界面,并打包和部署完整的应用程序。这不仅仅包括传统的独立Windows应用程序,还包括更像网页的应用程序。 第4章:WPF控件介绍。 第5章:缩放、定位和变换元素。 第6章:使用Panel进行布局。 第7章:构建及部署一个应用程序。第三部分:为专业开发人员设计的功能第三部分涉及的功能不仅仅在WPF应用程序中必须使用,也可以在很大程度上改进开发流程。因此,它们对于那些志在创建可维护和健壮的程序(或组件)的专业开发人员来说是不可或缺的。 第8章:资源。 第9章:数据绑定。 第10章:样式、模板、皮肤和主题。第四部分:通过富媒体使程序领先于时代这一部分将涵盖WPF最受人瞩目的特性。对2D和3D图形、动画、视频等的支持将允许你创建令人神往的用户体验,这些特性以及提供它们的方式使得WPF与以前的系统完全不同。WPF降低了将这些内容融入你的软件的门槛,因此,你才可以尝试一些过去从来不敢尝试的功能。 第11章:2D图形。 第12章:3D图形。 第13章:动画。 第14章:音频、视频、语音和文档。第五部分:高级主题第五部分涉及的主题是为高级应用程序开发人员和WPF控件的开发人员设计的。由于现有的WPF控件可以完全改变样式,所以大大减少了创建自定义控件的需求。 第15章:与Win32、Windows Forms和ActiveX的互操作性。 第16章:用户控件和自定义控件。 第17章:使用自定义Panel进行布局。第六部分:附录书中的一些约定书中用特别的字体表示术语和特殊条目,这些字体包括:字 体 意 思楷体 当我第一次提及一个新术语或者词时,我将使用楷体,有时也会为了强调使用楷体代码体 在屏幕提示信息、代码列表、命令示例和文件名中使用代码体。在代码列表中,斜体的代码体表示需根据实际替换浅灰色的代码体用于表示XAML元素和C#或C++关键字;粗浅灰色的代码体表示XML元素名称和C#或C++字符串;粗黑色的代码体表示XML特性;有底纹的代码体表示C#和C++中的类型名在整本书中,你会找到以下一些帮助栏: (常见问题解答)中通常是读者可能对本书中某个主题提出的问题,然后它会提供简明的解答。 (深入挖掘)中通常是高级的或者比帮助栏周围的文字更详细的关于这个主题的信息。如果你对某个主题比较好奇,可以好好看看“深入挖掘”的内容;但是如果你没有兴趣,可以忽略。 “提示”是一些可以在真实世界中帮助你的信息。它们通常会提供一些捷径或者替代方法,使得任务更加简单、快速或者产生更好的结果。 “注意”会告诉你一些动作或者条件,该动作或条件会引起一个不该出现的或不可预测的结果,它还会告诉你如何避免产生这样的结果。致谢首先,我不仅要向我的妻子Lindsay表示感谢,也要向她表示深深的歉意。令人遗憾的是,我在本书里所写的一切都没有办法弥补我过去一年中使她经受的磨难。在编写本书的过程中,我意识到两点,相信我的妻子也对这两点十分清楚:我写的书不会少于500页;要写这样一本书,我就不得不冷落我的家人。在新婚的第一年写第一本书也许还不算太糟糕,可这一年我们又初次为人父母。虽然,我可以在儿子入睡之后完成大部分的写作工作,但我却舍弃了太多和我妻子在一起的宝贵时光。然而在整本书写作期间Lindsay都显示出了不可思议的耐心和理解——比我所应得的要多得多。当离交稿时间越来越近,她为了让我能有充足的时间工作,每天早上5点就叫我起床,并悉心照顾我,帮助我保持身体健康。在我整理内容的时候,她甚至可以(站在我身后)提出她的想法和意见。总而言之,在我全神贯注坐在笨拙的小电脑前的时候,她照顾我,照顾我们的儿子,照顾我们的家,还有生活中的方方面面。她自始至终大度、谦虚、善解人意。Lindsay,我爱你,我还想对你说声对不起。虽然写作过程是孤寂的,但书却凝聚了许多辛勤工作的人们的智慧和心血。在此,我想花一些时间来感谢他们中的一些人,并按他们名字排序。特别感谢Daniel Lehenbauer,他是WPF中3D特性的开发主管,本书的3D章节是由他写成的,这远胜于我自己去勉为其难。加入了Daniel的观点和意见,对于所有想涉足3D的读者来说无疑是有极大益处的。Daniel还对本书的其他章节进行了非常细致的审校,提供了极有价值的意见。许多微软的同事也很爽快地答应审校一些章节,并提出了很好的反馈意见。在此我想感谢(按字母顺序排列)Beatriz de Oliveira Costa、Robert Hogue、Neil Kronlage、Mike Mueller、Oleg Ovetchkine、S. Ramini、Rob Relyea、Adam Smith和Tim Sneath。我还要感谢Lori Pearce和David Treadwell,有了他们的批准我才能写本书。我打心底感谢Sams的工作人员,特别是Neil Rowe,因为我不可能奢求比这更好的出版团队了。他们从没有质疑书的篇幅和风格是否符合Unleashed(揭秘)系列,也从来没有人责备我花的时间太长了(虽然在这个过程中我的确得到过有关进度的暗示)!他们没有给我任何束缚,所以我可以写一本我想写的书。当我问Neil是否可以彩色印刷这本书时,他不但这样做了,还十分有创意地把所有的示例代码按语法进行着色。 我还想感谢我的父母,是他们让我在上小学的时候就拓宽视野,接触计算机编程。如果你有孩子,在他们还小、还很在意你的意见的时候,请带他们了解编写软件的神奇艺术。(WPF甚至可以让他的体验更加有趣!) 最后,我要感谢你购买了本书,感谢你至少已经读到了这里!我希望你继续读下去,继续与我分享这令人痴迷的探索WPF之旅!