WPF学习建议

jinxuliang2 发表于   2015/3/28 18:59:40,阅读次数: 5838

本文与我在网易云课程所开设之《面向对象软件开发实践(专业技能训练)》第3单元:《乔装打扮话数据——数据绑定技术及应用》相互配合。

花了近两个星期的时间,录了近50个短视频,编写了近百个小实例,终于把WPF“数据绑定”这个技术领域中的精华向MOOC学习者展示出来,长舒一口气……


在完成了这个单元的MOOC视频制作之后,有些话没在视频中说,想了想,还是更适合写成博客,于是就有了这篇博文。


一 我们应该选择什么技术开发Windows桌面应用?


十多年以前,我用过VB、Delphi、C++ Builder、MFC写过Windows桌面应用程序,.NET出来以后,我又用Windows Forms和WPF写Windows桌面应用。


就我的观点,开发Windows桌面应用,选哪种技术,应看菜吃饭,粗略地可分为以下几种情况:


(1)如果你希望写出适用性广且性能优异的桌面应用,首选使用C++,调用各种UI组件库,开发非托管应用。它不需要目标计算机上安装.NET就能直接运行。


比如我就看见过有很多使用MFC开发出来的“老”程序,现在还在继续使用,表现出色。


使用这种开发方式,最大的问题是开发效率低,技术难度大,开发周期长,对开发者的技术水平要求较高,适合于开发“精品”且需要长期维护的应用程序。


(2)如果你希望开发效率高,且对UI界面没有什么特殊要求,主要使用标准的Windows控件,那么使用Windows Forms最合适。


(3)如果你希望写出很Cool很炫的界面,那么再没有比WPF更合适的了。


(4)Window 8添加了一种拥有Metro风格的桌面应用类型,但这玩意儿在以“鼠标 + 键盘”为主要交互手段的传统Windows桌面上,几乎没有什么戏,不理会它也罢。


二、为什么要学WPF?


与Windows Forms相比,WPF要难学得多(不过与MFC相比,WPF又不算一盘菜了)。那么,我们为什么要花这个时间去学它呢?


简要地说,我认为WPF本身是Windows桌面应用开发技术的“集大成者”,它汲取了在它之前各种技术的经验和教训,同时融入了很多很棒的想法,一些设计思想相当好,它所引入的很多概念,同样应用于其它的技术。


举些例子吧。


  • WPF的设计者认为,UI控件的行为应该与外观相分离,由此设计了“控件模板”,通过自定义控件模板,可以让某个控件(比如按钮),拥有几乎无限多种表现形式。
  •  WPF的事件处理机制是我所知道的开发技术中最完备的,共分为三种类型:一种是向下传播的“隧道型(Tunneling)”事件,另一种向上传播的是“冒泡型(Bubbling)”事件,还有一种是经典的CLR事件,用起来相当灵活。
  •   WPF的依赖属性也相当有特色,支持继承、变更通知和值自动调整,还衍生出了“附加属性”及“附加事件”这两个新玩意,把一个其他编程语言和技术中看上去没啥可说的简单的“属性”,硬是玩出了新花样。
  •  我最喜欢的是WPF的数据绑定,正是因为我学过用过它,有了个对比,后来我在开发Android应用的时候,在与ListView纠缠不休的时候,真的是无比怀念WPF的数据绑定,心中经常泛现出这样的念头:“奶奶的,这功能要用WPF去做,也就是编写一个数据绑定表达式的事,可恶的Android,居然要老子写数百行代码!”

     后来在写Web应用时,我发现了拥有类似于WPF数据绑定特性的AngularJs,大喜,原先受宠的jQuery立马被我打入冷宫……

当然,WPF也存在着一些问题,比如过于庞大和臃肿,程序装载速度比较慢,有些组件设计得过于复杂,还有些奇奇怪怪的坑,一不小心,掉里头你半天爬不出来……

但不管怎么说,WPF给了程序员足够发挥的余地,仍然是你写出既Cool又炫的Windows桌面应用的首选。


三、WPF学习建议


我在网易云课堂开设的《面向对象软件开发实践(专业技能训练)》MOOC课的第三单元(http://mooc.study.163.com/learn/BIT-1000013000),集中介绍了WPF技术领域中的亮点——数据绑定,虽然没有涵盖其全部技术要点,但这一技术子领域中的精华己经展现给学习者了。


WPF本身是一个很庞大的技术领域,这门MOOC课程只能蜻蜓点水般地介绍一些实用的WPF编程技巧以及技术关键点,更多的内容,还需要同学们自己利用互联网等资源去自学。


下面点出大家进一步学习的建议:


1、WPF基础部分
这部分内容为开发WPF应用所必须,由于课时有限,我没有在MOOC上提供这些内容的教学视频,需要大家在学习我介绍“数据绑定”的MOOC课程之前,通过自学的方式掌握:


(1)XAML的语法基础
(2)样式(Style)
(3)界面布局
(4)常见控件的用法(TextBox,Image,Web Browser等)

掌握了上述内容,再学我放在MOOC上的视频,应该就不会有太多的技术障碍了。

二、进阶部分

在通过MOOC视频学完了WPF数据绑定技术,并完成了单元作业之后,如果想进一步地深入学习,可以自己探索以下技术,它们也是WPF这个技术领域中的精华部分。


(1)命令绑定机制
(2)用户控件,自定义Element
(3)控件模板
(4)Flow Document与RichTextBox,打印
(5)动画、音频与视频
(6)二维及三维图形

四、结束语


现代软件系统,很多是以“数据为中心”的,数据的提取与呈现是这种类型软件系统的两个主要任务。
我在“WPF数据绑定概述”一讲中,给出过这样的一个示意图:

 


从图中不难明白,在桌面应用中,WPF数据绑定负责把数据源对象与UI界面关联起来,实现针对数据源对象的CRUD,但它并不负责把这些数据真正地存储到数据库等底层数据存取介质中,这些工作是由数据存取技术(比如ADO.NET和Entity Framework)负责的,与数据绑定无直接关联。


如果是Web应用,就把WPF换成AngularJS,上图照样适用,而AngularJS数据绑定技术(也是非常Cool的),将在第二系列的后面课时中介绍。

最后说说《面向对象软件开发实践》这门MOOC课程的“总体思路”。


我这门MOOC课程分为三个系列(基础技能训练、专业技能训练和实战技能训练),全部课程都是围绕着“移动互联应用”而展开的,这是当前最红火的领域,业界急需掌握这些技术的人才。


开发一个移动互联应用,包容客户端与服务端两个领域,涉及诸多的技术,少了一个都不成。这门课的第一系列是打基础,第二系列是攻坚战,需要扎扎实实地把第二系列所介绍的各个技术掌握好,这样,到了第三系列,你才能把它们“组合”起来,开发出完整的移动互联应用,整个技术地图是这样的:


(1)服务端用C#写,用到ASP.NET MVC、Web API、Entity Framework,数据库用到SQL Server,还会介绍如何在网站中使用MongoDB存取数据。


(2)浏览器客户端用JavaScript写,使用Bootstrap + AngularJS框架开发。


(3)手机端用Java写,开发Android App。


学完了WPF数据绑定,后面将转向数据存取技术,介绍ADO.NET,Entity Framework和Android数据存取技术。


长路漫漫,且行且珍惜!


附件清单



评论于: