前言
学习一项新东西之前,先对他有一个简单慨括性的认识时十分由必要的,如果只是一股脑儿的扎进去,往往得达不到你想要的效果。这是我以前经常会犯的错误,花费了大量的精力纠缠于细枝末节,结果却收获甚少。所以这一次为了学会使用WPF,我先到网上查找了很多资料关于WPF的资料和其他开发这对它的评价。
俗话说的好,磨刀不误砍柴工,尽管我还一句代码都没有写,但是通过查找的这些信息,我却已经对WPF设计的目的、优缺点以及其使用范围有了一很清晰的认识。
WPF是什么
在没有了解它之前,我一直都傻傻的搞不清C#和WPF的关系,现在终于懂了,简单来说WPF只是一套界面开发系统,只是由于主要用C#开发,所以常常被一起提及。
稍微官方一点,WPF是Windows Presentation Foundation的缩写, 中文译为“Windows呈现基础”,是微软推出的基于Windows Vista的用户界面框架,由 .NET Framework 3.0 开始引入,与 Windows Communication Foundation及 Windows Workflow Foundation并行为新一代 Windows操作系统以及 WinFX 的三个重大应用程序开发类库。
以上是参考百度官方的解释,听起来很高大上,实际上用WPF也是能够做出很炫的界面来的。但是从微软推出来这么多年了,却很少商业的软件使用它,也证明了它实际上还是有很多不足之处,或者合适的适用范围不算大,其他领域有更优秀的替代者。
WPF的特点
大家谈WPF的时候总是对比WinForm,可惜我WinForm了没有做过,只能对比一下老掉牙的MFC了。
使用了比较强大的xaml语言来设计界面
回想一下MFC是怎么开发界面的:当然是直接拖放控件啦。通过可视化的界面设计器设计ui,VS则同步将你的修改翻译成文本文件,来记录窗口和它上面控件的位置和大小。但是也仅仅于此,MFC使用的这种界面记录语言对界面的控制表达能力太若了,除了了记录控件的固定的位置、大小,以及一些简单的固有属性,我真不清楚它还有什么其他作用。不过说起来,这个文本文件本来就不算是一个有比较清晰的语法规范的语言,而且在实际使用时,基本上不会用到它,而是直接拖放界面。总的来说用MFC的界面设计器来设计界面,可以说除了直观一点外,没有什么其他好处,所以我在做MFC时,宁愿直接用C++代码来实现,这样至少保证我的程序是一个完整的整体,大部分代码都能在我自己的控制范围内,不会出现因为界面某次操作错误而导致程序无法编译,然后还没法去排查错误的问题。
而在WPF中就不一样了,同样的可视化设计,但是它的核心却在它的设计脚本语言上。它采用的界面设计语言xaml是XML的扩展,可以完成非常复杂而精细的界面控制。就我个人的初步体验来看,它是非常类似于用html来设计网页。如界面元素的布局、排版、对齐,终于可以不再花费大量的时间去手动实现了,基本上界面的控制都可以用xaml来控制。由于xaml是本质上是XML,遵循的XML的标准,这使得它有清晰、标准的语法结构,这样使它的控制力和可读性都使非常强的。
另外,在独立控制界面的基础上,xaml还有一些与后台通信的方式,这使得WPF设计界面即保持了很强的独立性,有可以方便与后台保持交互。
数据驱动
对与刚刚接触WPF的我,数据驱动是让我映像最深刻的一个特性。把控件的数据源和数据绑定,直接操作数据,界面就会跟随更新,这就让数据和界面分离开来了,而且将原来可能本来使对复杂界面的变成了直接对数据的操作,一下子让程序简单了很多。通常对复杂的数据会抽象成模型,便于做统一的操作。
实际上这样的特性我在Qt中已经有所接触。Qt里使用的是MVC模式,WPF则使用的是MVVC模式,由于加入了多个V(ViewMode)层,让它有了更好的特性,如:双向绑定技术,界面和数据源绑定后,任意一方改变,另一方都会自动跟随改变。至于MFC,就完全看不到这种东西,要操作数据,都是通过传统的方法去做:获取控件本身,然后再获取其数据,然后再修改修改数据。而MFC不同的控件获取的方法可能不一样或者有是条件和限制的或是需要传入很多其他复杂的参数,这导致它的操作相当的繁琐。
一些缺点
- 性能差,内存占用量大
- 基于.net,在很多低版本的版本的windows上不能使用,其他平台就不用更不说了。