WPF简介

目录

什么是WPF?

WPF的历史?

为什么要用WPF及WPF作用

WPF与winForm区别?

什么是WPF?

Windows APIWindows Presentation Foundation (WPF):Windows 客户端应用程序,微软推出的基于Windows 的用户界面框架。

WPF是应用程序一个崭新的概念:数据驱动程序,以数据为中心,通过Bind将界面永远定位为从属地位。

说白了就是一个把数据呈现给用户的UI界面。

WPF不是一个简单的UI界面显示 ,它的功能包括可扩展应用程序标记语言 (XAML)、控件、数据绑定、布局、二维和三维图形、动画、样式、模板、文档、媒体、文本和版式。

WPF是基于DirectX引擎的,支持GPU硬件加速,不支持硬件加速时也可以使用软件绘制。高级别的线程进行绘制,提高使用者的体验。自动识别显示器分辨率并进行缩放,比如Vista。


WPF技术发展历史

微软1983春宣布研究Windows,微软官方主力推行的编程语言与API有四个主要阶 段:

1983~1991年:C搭配Windows API。当时程序员少,开发一个项目比较困难。

1992~2001年:C++搭配MFC库。MFC是最多人用的Windows编程方法。慢慢的MFC技术逐渐退出了历史的舞台。

2002~2006年:(C#、VB以及其他语言)+Windows Form框架。这段期间IT技术的焦点是在Web上,主角是ASP.NET,而不是Windows Forms。这时WPF就出现。Windows Forms其实是不错的技术,但没有引起大家重视,更偏向于用Delphi和MFC,造成Windows Forms生不逢时。

2007~现在 :2007年1月30日,Windows Vista正式全球同步发布。它之所以能实现那么绚丽的效果,最关键的一点就是Windows Presentation Foundation(WPF),WPF所带来的震撼视觉效果和用户体验使Vista的效果如此绚丽,为 Windows 7打下了坚实的继承。后台语言(C#、VB以及其他语言)+XAML构成的WPF。WPF支持硬件加速、精确颜色、浮点坐标、动画实现、三维、视频感受等要求提高。而传统 Winform 是到不到这些效果的。

为什么要用WPF及WPF作用

每次的技术前进都会让我们提高工作的效率,WPF为我们减少了很多的代码,而且实现了逻辑与界面很好的分离。

WPF,你可以创建丰富、美妙的连接应用程序,以充分利用 Windows 平台,其中包括 UI、媒体、脱机通信和文档支持

WPF核心组件

WPF 中的所有显示是通过 DirectX 引擎完成的,可实现高效的硬件和软件呈现。

WPF 对内存和执行进行精确控制。

milcore组件,它的职责是完成与Direct3D的交互,出于效率和安全考 虑,milcore由非托管代码实现。

milcore 中的组合引擎受性能影响关系大,需要放弃 CLR 的许多优点来提高性能。

WPF的两大核心组件PresentationFramework和PresentationCore都位于通用语言运行库(CLR)之上。WPF的大部分代码都是以托管形式存在的。这两大组件提供了WPF项目需要的函数库和功能库,由于是以托管的形式存在,所以也避免了我们直接操 作底层和出现诸如内存泄露的可能性。

WPF基本功能和服务

五大块:

Core Presentation:包含了所有的图形效果,如图形、2D图形、3D图形、文本、音频、视频和显示效果。包 括强大的动画效果,动画可以应用前面的所有元素。最下面的那个就是视觉基本元素。

User Interface Services:包含了Application Services(应用程序服务)、Deployment Services(部署服务)、Controls(控件库)、Layout(布局)和Data Binding(数据绑定).

Base Services:提供了XAML支持、Accessibility(提高开发效率)、 Input&Events(输入和事件的支持)、PropertySystem(属性系统)。

Document Servies :基本的打印,实现自定义的打印

XPS Viewer:表报服务,可以通过这些组件显示 效果。


基本特性及使用情况


在输入方面:WPF支持键盘、鼠标、手写笔、触摸屏,蓝牙录入、视频扑捉等,所以基本没有任何限制

外部设备的交互:有驱动、COM、Win32或 通信协议支持的任何设备

打印和报表方面:可访问打印对话框、打印队列、打印窗体、控件以及很多可选操作,对报表也有很好的支持。

支持流文档和固定 文档,对命令的支持以及对文件的无限制访问,尤其在动画、图形图像、3D、影像的支持相当好。

WPF除了在性能方面存在 着缺陷以外,其他方面可以说是做得非常优秀。

相似的技术

WPF:使用XAML定义程序界面(如前所述,可以手工编写,可以采用 Experssion Blend等可视化工具编写),再用.NET语言(C#, VB.Net等)编写相应的逻辑代码。

逻辑代码既可以直接嵌入XAML文件中,也可保存为独立的代码文件

桌面应用程序和Web应用程序

一套编码,桌面应用程序与Web应用程序均可运用。

WPF不仅使美化、多样化了桌面应用程序,也是使Web变得异彩纷呈。WPF使3D进 入Web成为可能。比如,你可以使用矢量图形设计软件(Illustrator, CorelDraw等, 微软也有了!叫“Expression Designer”)设计好图片,然后将图形输出或导出成为XAML格式。然后,你可以在Blend中打开XAML文件,制作成动画,最后生成的也是 XAML。通过.Net语言(如C#)进行编程,还可以控制这些XAML。

WPF与WinForm、silverlight区别

WPF技术比WinForm技术更先进,来取代WinForm技术的。

silverlight是简版的WPF,silverlight只可用于给WEB应用程序添加动态内容。WPF则可以编写在跨越WEB和桌面的应用程序


Windows Forms在底层使用的是GDI+。GDI+是GDI的“面向对象包装”,C++实现。Windows Forms应用程序的GDI+,在C++实现的非托管代码之上又包了一层,从而让我们能使用C#这样的托管编程语言调用GDI+功能绘图。

WPF底层使用的是DirectX,就是通常用来开发游戏的那个DirectX。

Silverlight在API层可以看成是WPF的子集,除了这点之外,Silverlight与WPF无任何联系。Silverlight应用程序不依赖于.NET Framework,用户计算机、手机安装有Silverlight运行环境(比如浏览器添加了Silverlight插件),即可运行Silverlight应用程序。Silverlight运行时环境在API层面也可以看成是标准.NET Framework的功能子集,但它是重新写过的,独立于标准的.NET Framework。

Windows Forms/WPF/Silverlight这三者是独立发展的三个技术领域。微软出于方便开发的目的,有意让Silverlight与WPF在应用层面开发体验(甚至包括大部分应用层代码)高度一致。


开发角度


Windows Forms成熟,拥有大量的第三方控件等资源,如果开发“标准”与“通用”界面类型的Windows应用程序,使用它可以获得较高的开发效率和不错的运行性能。

WPF的开发非常“个性化”的Windows应用程序,实现你所能“梦想”到的各种用户界面,且在动画等多媒体方面,WPF优于Windows Forms。WPF的数据绑定机制也比Windows Forms要强大和灵活。

Windows Forms和WPF主要用于开发桌面应用程序,Silverlight主要战场是互联网,通常用它来开发RIA的互联网应用程序,或者手机等智能移动设备上的应用程序。

会WPF,不费太多力气,就可以转去开发Silverlight应用程序,两者相似,特别是界面层代码,由于都使用XAML,这使我们可以比较容易地为某一应用程序同时开发“桌面版”、“手机版”和“浏览器版”三种版本,而这三种版本其用户界面都可以拥有一致的外观和用户使用体验。


比较


WPF对计算机硬件的要求较高,对于硬件配置较低的计算机,其运行性能不如Windows Forms版本,对内存也是有要求的。随着计算机硬件的性能提高,差距会越来越小。

界面的执行效率:WinForm优于WPF

开发效率: WPF优于WinForm,WPF实现 UI与逻辑分离,适合团队开发,而且在维护成本低。

开发成本,WPF高于WinForm

美观度:WPF优于WinForm

范围应用:WPF优于WinForm


WPF比WinForm的较好的特性


什么是Window Handle?(句柄)

答:Handle是Windows操作系统中的一个概念。在Windows程序中,有各种各样的资源(窗口、图标、光标等)且资源都有标示号,创建这些资源时系统会为它们分配内存,返回资源的标示号,即句柄。句柄指的是一个核心对象在某一个进程中的唯一索引,而不是指针。句柄是和对象一一对应的32位无符号整数值


一、解决Window Handle问题


 原因:  在Windows GDI或WinForm开发中复杂的GUI应用程序,使用的大量的控件,如Grid等。每个控件或Grid cell都会是一个小窗口,会使用一个Window handle,尽管控件厂商提供了很多优化办法,但还是会碰到Out of Memory或"Error Create Window handle",而导致程序退出。

WPF解决方式

WPF改变了控件显示的模式,控件不再使用窗口,也就不会占用Window handle。

理论上,如果一个WPF只有一个主窗口的话,WPF只会使用一个Window handle(如果忽略用于Dispatcher的隐藏窗口的话)。所以WPF GUI程序不会出现Window handle不够用的情况。


二、线程问题


在WinForm程序开发时,因worker线程修改控件的属性而导致程序崩溃,这种非法操作并不是每次都失败。WinForm控件提供了InvokeRequired属性来判断当前线程是不是控件创建线程。但是当控件树很深时,属性会比较慢。

WPF开始设计的时候,就考虑到了多线程的问题。WPF类基本继承于DispatcherObject DispatcherObject实际就是对Dispatcher的一个简单封装。Dispatcher提供了类似InvokeRequired的方法(CheckAccess)。此方法只比较线程的ID,速度比较快。另外,Dispatcher提供了优先队列,异步调用,Timer等功能,简化了开发多线程GUI程序。


三、控件的Composition


在WinForm如果要实现一个有Checkbox的下拉菜单,将不得不处理复杂的Window消息。

通过WPF控件的Content Model和Layout系统,WPF控件可以包括任何类型的控件,甚至.Net CLR对象。有了这个基础,开发新的WPF控件更加简单了。


四、XAML


通过XAML,可以用文本的方式描述复杂的Object Graph。通过Command,Routing Event等机制,界面设计人员和程序员清楚的进行了界限。


五、Dependency Property


在WinForm开发中,一个控件的值变了,其他控件也会跟着改变。解决办法是通过写代码或通过数据绑定,通过写代码是界面和代码没法分开,后者还不够灵活。

WPF在这方面通过XAML可以简单的把相关的属性联系起来,通过Extension可以实现复杂的绑定关系。

总结

不管是WinForm还是WPF都是可以进行很好的桌面程序的开发,各自有自己的特点。

如果你对UI要求不是很高,想追求性能好一点那就用WinForm

如果想做的非常美,那就用WPF,而且WPF也可进行Web开发。如果有WPF网页开发需求,可以尝试转换平台到Silverlight

推荐阅读更多精彩内容