WPF是.NET 3.0最重要的组成部分,微软最新的程序界面开发技术,相当于MFC的最新版本,而且应用面要广得多。《WPF揭秘》是Amazon最佳畅销书,还获得了2008年Jolt大奖提名。
第一部分 背 景
第1章 为什么创造WPF 2
1.1 回顾过去 2
1.2 步入WPF 3
1.3 作为.NET Framework的组成部分 7
1.3.1 为托管代码而设计 8
1.3.2 强调声明式描述 8
1.4 小结 9
第2章 XAML揭秘 10
2.1 XAML定义 11
2.2 元素和特性 11
2.3 命名空间 12
2.4 属性元素 14
2.5 类型转换器 15
2.6 标记扩展 16
2.7 对象元素的子元素 18
2.7.1 内容属性 18
2.7.2 集合项 19
2.7.3 更多类型转换 20
2.8 编译:将XAML与过程式代码
混合使用 22
2.8.1 在运行时加载和解析XAML 22
2.8.2 编译XAML 24
2.8.3 XAML关键字 28
2.9 小结 29
2.9.1 抱怨1:XML太过冗长不便于
输入 30
2.9.2 抱怨2:基于XML的系统性
能差 30
第3章 WPF的重要新概念 31
3.1 逻辑树与可视树 31
3.2 依赖属性 35
3.2.1 依赖属性的实现 36
3.2.2 变更通知 38
3.2.3 属性值继承 39
3.2.4 对多个提供程序的支持 41
3.2.5 附加属性 43
3.3 路由事件 46
3.3.1 路由事件的实现 46
3.3.2 路由策略和事件处理程序 48
3.3.3 路由事件实践 48
3.3.4 附加事件 51
3.4 命令 53
3.4.1 内建命令 54
3.4.2 使用输入手势执行命令 57
3.4.3 带有内建命令绑定的控件 58
3.5 漫游类层次 59
3.6 小结 60
第二部分 构建WPF应用程序
第4章 WPF控件 62
4.1 内容控件 63
4.1.1 按钮 63
4.1.2 简单容器 66
4.1.3 带头(header)的容器 70
4.2 Items控件 71
4.2.1 选择器 73
4.2.2 菜单 82
4.2.3 其他Items控件 85
4.3 Range控件 89
4.3.1 ProgressBar 89
4.3.2 Slider 90
4.4 文本和墨水控件 90
4.4.1 TextBox 91
4.4.2 RichTextBox 91
4.4.3 PasswordBox 92
4.4.4 InkCanvas 92
4.5 小结 93
第5章 尺寸缩放、定位与变换元素 94
5.1 控制尺寸 95
5.1.1 高度和宽度 95
5.1.2 Margin和Padding 96
5.1.3 Visibility 98
5.2 控制定位 98
5.2.1 对齐 99
5.2.2 内容对齐 99
5.2.3 FlowDirection 100
5.3 应用变换 101
5.3.1 RotateTransform 102
5.3.2 ScaleTransform 103
5.3.3 SkewTransform 105
5.3.4 TranslateTransform 105
5.3.5 MatrixTransform 106
5.3.6 组合变换 106
5.4 小结 107
第6章 使用面板做布局 108
6.1 Canvas 109
6.2 StackPanel 111
6.3 WrapPanel 112
6.4 DockPanel 114
6.5 Grid 116
6.5.1 改变行和列的尺寸 119
6.5.2 与GridSplitter交互改变
尺寸 120
6.5.3 共享行和列的尺寸 122
6.5.4 Grid与其他面板的比较 123
6.6 原始面板 124
6.6.1 TabPanel 125
6.6.2 ToolBarOverflowPanel 125
6.6.3 ToolBarTray 125
6.6.4 UniformGrid 125
6.7 处理内容溢出 126
6.7.1 剪辑 126
6.7.2 滚屏 127
6.7.3 缩放 129
6.8 把它们拼合:创建一个类似Visual Studio
的可收缩、可停靠、可改变尺寸的窗格 132
6.9 小结 141
第7章 构建并部署应用程序 142
7.1 标准Windows应用程序 142
7.1.1 Window类 143
7.1.2 Application类 145
7.1.3 创建并显示对话框 150
7.1.4 维持并恢复应用程序状态 152
7.1.5 部署:ClickOnce与Windows
Installer 153
7.2 基于导航的Windows应用程序 154
7.2.1 Page和它们的导航容器 154
7.2.2 页间导航 156
7.2.3 页间数据传递 160
7.3 拥有Windows Vista感官的应用程序 162
7.3.1 用TaskDialog替代
MessageBox 163
7.3.2 使用Aero Glass 165
7.4 Gadget风格的应用程序 168
7.5 XAML浏览器应用程序 169
7.5.1 功能限制 170
7.5.2 集成的导航功能 172
7.5.3 部署 172
7.6 松散XAML页 175
7.7 小结 176
第三部分 为专业开发人员设计的功能
第8章 资源 178
8.1 二进制资源 178
8.1.1 定义二进制资源 178
8.1.2 访问二进制资源 179
8.1.3 本地化 183
8.2 逻辑资源 184
8.2.1 资源查找 187
8.2.2 静态资源与动态资源 187
8.2.3 与系统资源交互 192
8.3 小结 193
第9章 数据绑定 194
9.1 绑定对象 194
9.1.1 在程序代码中使用绑定 194
9.1.2 在XAML中使用绑定 196
9.1.3 与普通.NET属性绑定 197
9.1.4 绑定到整个对象 199
9.1.5 绑定到集合 200
9.1.6 与DataContext共享源 203
9.2 控制呈现 204
9.2.1 使用数据模板 204
9.2.2 使用值转换器 206
9.3 定制一个集合的视图 210
9.3.1 排序 210
9.3.2 分组 212
9.3.3 过滤 214
9.3.4 导航 215
9.3.5 使用其他视图 216
9.4 数据提供程序 218
9.4.1 XmlDataProvider 218
9.4.2 ObjectDataProvider 222
9.5 高级主题 224
9.5.1 自定义数据流 224
9.5.2 向绑定添加验证规则 226
9.5.3 写你自己的验证规则 226
9.5.4 使用不相交源 228
9.6 把它们拼合:纯XAML RSS阅读器 230
9.7 小结 232
第10章 样式、模板、皮肤和主题 233
10.1 样式 234
10.1.1 共享Style 235
10.1.2 触发器 240
10.2 模板 244
10.2.1 控件模板 245
10.2.2 与触发器交互 246
10.2.3 限制目标类型 247
10.2.4 关于已应用模板的父元素的
属性 248
10.2.5 关于可视状态 254
10.2.6 将模板与样式混合起来 258
10.3 皮肤 260
10.4 主题 266
10.4.1 使用系统颜色、字体和参数 266
10.4.2 每个主题的样式和模板 267
10.5 小结 270
第四部分 通过富媒体使程序领先于时代
第11章 2D图形 272
11.1 Drawing 273
11.1.1 Geometry 275
11.1.2 Pen 283
11.1.3 剪贴画示例 285
11.2 Visual 286
11.2.1 用内容填充DrawingVisual 286
11.2.2 在屏幕上显示Visual 289
11.2.3 可视命中测试 291
11.3 Shape 297
11.3.1 Rectangle 298
11.3.2 Ellipse 299
11.3.3 Line 300
11.3.4 Polyline 300
11.3.5 Polygon 301
11.3.6 Path 301
11.3.7 基于Shape的剪贴画 302
11.4 Brush 303
11.4.1 颜色笔刷 303
11.4.2 tile笔刷 309
11.4.3 把Brush用作透明掩码 315
11.5 位图效果 317
11.6 小结 320
第12章 3D图形 321
12.1 3D图形入门 321
12.2 Camera和坐标系统 325
12.2.1 Position属性 325
12.2.2 LookDirection 327
12.2.3 UpDirection 329
12.2.4 平行投影与透视投影 331
12.3 Transform3D 332
12.3.1 TranslateTransform3D 334
12.3.2 ScaleTransform3D 335
12.3.3 RotateTransform3D 337
12.3.4 Transform3D组合 339
12.4 Model3D 340
12.4.1 光照(Light) 341
12.4.2 GeometryModel3D 345
12.5 Visual3D 357
12.5.1 ModelVisual3D 357
12.5.2 3D命中测试 358
12.6 Viewport3D元素 359
12.7 小结 362
第13章 动画 363
13.1 程序代码中的动画 363
13.1.1 “手工”实现动画 363
13.1.2 动画类 365
13.1.3 简单的动画调整 370
13.2 XAML中的动画 373
13.2.1 EventTrigger包含
storyboard 374
13.2.2 将Storyboard作为Timeline
使用 379
13.3 关键帧动画 381
13.3.1 线性关键帧 382
13.3.2 样条关键帧 384
13.3.3 离散关键帧 385
13.4 小结 387
第14章 音频、视频、语音和文档 388
14.1 音频 388
14.1.1 SoundPlayerAction 389
14.1.2 MediaPlayer 390
14.1.3 MediaElement和
MediaTimeline 390
14.2 视频 392
14.2.1 控制MediaElement的外观 392
14.2.2 控制媒体 394
14.3 语音 397
14.3.1 语音合成 397
14.3.2 语音识别 400
14.4 文档 403
14.4.1 创建流文档 403
14.4.2 显示流文档 412
14.4.3 添加注释 414
14.5 小结 417
第五部分 高级主题
第15章 与Win32、Windows Form
以及ActiveX之间的互用性 420
15.1 在WPF应用程序中嵌入Win32控件 421
15.1.1 一个Win32 Webcam控件 422
15.1.2 在WPF里使用Webcam控件 425
15.1.3 支持键盘导航 430
15.2 在Win32程序里嵌入WPF控件 434
15.2.1 HwndSource 434
15.2.2 获得正确的布局 437
15.3 在WPF应用程序中嵌入Windows
Forms控件 440
15.3.1 用程序代码嵌入一个
PropertyGrid 440
15.3.2 用XAML来嵌入一个
PropertyGrid 442
15.4 在Windows Forms应用程序里嵌入
WPF控件 443
15.5 在WPF应用程序中嵌入ActiveX控件 447
15.6 小结 450
第16章 用户控件和自定义控件 452
16.1 创建用户控件 453
16.1.1 创建用户界面 453
16.1.2 创建行为 455
16.1.3 添加依赖属性 458
16.1.4 添加路由事件 460
16.2 创建自定义控件 461
16.2.1 创建行为 462
16.2.2 创建用户界面 467
16.2.3 对更复杂控件的思考 470
16.3 小结 473
第17章 使用自定义面板做布局 474
17.1 面板与其子元素的通信 474
17.1.1 检测步骤 474
17.1.2 排列步骤 476
17.2 创建Office 2007风格的
RibbonPanel 477
17.2.1 RibbonPanel的行为 477
17.2.2 RibbonPanel实现 478
17.3 小结 481
第六部分 附 录
附录 有用的工具 484
能够有机会翻译本书这样的名著,我们都感到非常荣幸。经过4个月的辛苦努力,本书的中文译稿终于交到了出版社中,我们也总算可以松一口气了!
不得不承认,翻译是非常辛苦的一件工作。首先自己必须要对原文有通透的理解,然后再用流畅的汉语表达出来,同时还要避免术语的不一致,等等。在这次的翻译过程中遇到了很多问题,也放弃了一个又一个“美好”的双休日。虽然我本人已经有一些翻译经验,但是要管理多人来翻译一本书的确有一些难度。刚开始的时候,我负责制定翻译计划,规范翻译流程——谁负责哪一章节且应该在何时完成。 一切看起来似乎安排得很好,但计划不如变化快,实际的进度并没有我想象当中的顺利。在翻译的第一阶段,我们的整体进度明显落后,主要是由于每位译者工作都比较忙,没有办法把太多时间投入到翻译工作中。于是不得不调整翻译计划,并向出版社多申请了一个月的翻译时间,以防万一。现在看来这个“容灾方案”还是很有效的!
在本次翻译过程中,我们也遇到了不少的困难。夏寒家里发生了点意外,不得不在中途退出,没有参加本书的最后审校。但无论多么困难,他还是按时完成了第一稿,而且总体质量不错,在此向夏寒表示由衷的感谢!另外,我也“不幸”换了部门,折腾了大约1个月,其中的辛酸只有自己知道,不过这基本没有影响翻译进度,一切还算顺利!
在此要感谢陈兴璐编辑,没有她的及时催促,也就不会让我们意识到进度的滞后;没有她一次又一次的审校意见,也就没有译稿的高质量。虽然有时也会和她在一些审校意见上产生一些小摩擦,但这都是必要的,大家都很清楚这是为了提高译稿的质量。在此还要感谢刘江总编辑,是他把这么一本好书引进了中国,让中国的读者可以在第一时间拜读这本WPF的“圣经”。对于本书的好我想大家也早有耳闻,在这里我就不再唠叨了,你自己买一本看看就明白了!对了,别忘了先看看原作者的序,它会告诉你这本书适不适合你以及你应该怎么读这本书,这也是我买每一本书之前必做的事情。
作为读者的你拿到本书的时候可能还是初春乍暖还寒的时节,但在阅读的时候你一定会体会到WPF所带给你的暖意。WPF的强大绝对是你无法想象的,充分发挥你的创造力,用WPF尝试着创造一些科幻般的应用程序吧!相信我,这绝对不是梦想!当你读完本书之后,你对这句话会有更深切的体会!
本书的第4、5、7、15章及附录由单佐一翻译,第11、12、13章由夏寒翻译,其余部分由我翻译。大家如果有任何意见和建议,或者想交流读书心得都可以通过我的博客(tonyqus.cnblogs.com)或电子邮箱(tonyqus@gmail.com)与我取得联系。
另外还要感谢博客园(cnblogs.com)的站长杜勇(dudu),他的辛劳园子里的兄弟都是有目共睹,很多朋友(当然也包括我)都是伴随着博客园一起成长的,没有博客园就没有今天的我们。在此也希望各位读者多多支持博客园,经常去博客园逛逛,相信大家会收获不少。
最后祝大家读书愉快,编码愉快!
Happy Reading, Happy Coding!
瞿杰(Tony Qu)
曾任微软SDE
CSDN .NET专家
于上海
前 言感谢你购买《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之旅!
无封面