WPF 是 .net framework 3.0 推出的新的用户界面开发库;
区别:
- 底层方面:
Winforms 底层依赖 GDI+, 传统的 Win32Api,特别是 User32.Api(Winforms 中的控件实际也是窗口,所以通讯方式和 wpf 不同)
WPF 底层是依赖 Direct3D。
说明:
GDI+(Graphics Device Interface)图形设备接口,它的主要任务是负责绘图程序之间的信息交换、处理,所有windows程序的图形输出;
DirectX(Direct Extension)多媒体编程接口,加强3D图形和声音效果,有很多API组成。按照性质分类可分为四大部分:显示部分,声音部分,输入部分和网络部分
所以 Winforms 和 WPF 是两套平行的 UI 开发库,而且 WPF 在图形界面上更胜一筹 - 多线程
1)在WinForm程序开发时,最头疼的一个问题就是,worker线程修改控件的属性而导致程序崩溃,而且这种非法操作并不是每次都失败。 WinForm控件提供了InvokeRequired属性来判断当前线程是不是控件创建线程。问题是当控件树很深是,这个属性会比较慢。
2)WPF开始设计的时候,就考虑到了多线程的问题。大部分的WPF类都继承于DispatcherObject。DispatcherObject实际就是对Dispatcher的一个简单封装。Dispatcher提供了类似InvokeRequired的方法(CheckAccess)。这个方法只是比较线程的ID,所以会很快。另外,Dispatcher提供了优先队列,异步调用,Timer等功能,简化了开发多线程GUI程序。 3)WPF 占用系统资源多,较为复杂,不过会WPF,SilverLight 也不难~~ - Window Handle 问题
WinForm 中的控件,每个控件都是一个小窗口(Grid 的 Grid cell 也算一个窗口) ,会使用一个Window handle,尽管控件厂商提供了很多优化办法,但还是会碰到Out of Memory或”Error Create Window handle”,而导致程序退出。
WPF 使用了不同的控件显示的模式,控件不再使用窗口,也就不会占用Window handle。理论上,如果一个WPF只有一个主窗口的话,WPF只会使用一个Window handle(如果忽略用于Dispatcher的隐藏窗口的话)。 WPF 应用程序不会出现Window handle不够用的情况。
参考: