从来没想好好阅读一本关于编程方面的书,我个人喜欢买书,但是买书仅仅局限于某个项目会用到某本书中的某项技术!在一个项目结束之后,书籍也就束之高阁,再也失去了他的价值!最近想静下心来编写一个貌似有点技术含量的软件,全部工作均打算在空余时间完成,为了某个诺言,也为了考验自己到底还剩下多少耐心来静静地看完一本书!
打算整个系列的WPF一一细读,并加入自己学习过程中的某些体会,里面可能有些自己认识上的误区,也希望高手看到的时候不吝赐教,也希望可以帮助跟我一样想学习WPF的朋友们,共同交流提高!
希望循序渐进又不失速度地完成整个系列!
那么---现在开始第一章(WPF介绍)!
WPF, Windows Presentation Foundation,中文又称Windows演示基础,是一个用于Windows的图形显示系统!WPF是针对.Net而设计的,受现代显示技术(如HTML和FLASH)以及硬件加速技术的影响!
以前,标准Windows应用程序主要依靠以下两种技术来创建用户界面:
1. User32---为许多元素(如按钮,窗口,文本框等)提供了熟悉的Windows外观
2. GDI/GDI+---为渲染简单形状,文本以及图像提供了绘图支持,但是增加了复杂程度,但是整体性能较差
比如说,我们都熟悉的MFC,就是使用以上两种内容,做了一个封装器,虽然减少了程序员编写代码的部分工作,但是整体上而言,整个MFC仍然受制于界面比较单一,所使用的资源工具有限,如果要编写一个比较炫目多彩的软件界面,我们往往需要在MFC基础上做大量的工作才能得到我们或者客户想要的效果!
为了解决User32和GDI/GDI+的效率问题,微软提供了一个解决方案:DirectX; DirectX最初主要是针对Windows平台上游戏而设计,重点关注速度,并与显卡供应商合作,以便为DirectX提供复杂的纹理映射,特殊效果(如半透明),以及三维图形所需要的硬件加速!
在WPF中,底层的图形技术不再是GDI/GDI+,而是使用DirectX。需要强调的是,不管创建那种用户界面,WPF应用程序在底层都是使用DirectX;当然WPF也会根据自身系统以及显卡的配置来决定使用的级别,这些也是显而易见的!
WPF除了使用DirectX作硬件加速意外,还提供了很多高级服务:
- 类似Web的布局模型:采用灵活的流式布局,而不再使用坐标来做定位,可以灵活排列控件,从而适应多变的内容以及多语言的需要!
- 丰富的绘图模型:
- 丰富的文本模型:
- 作为首要编程概念的动画;
- 支持音频和视频媒体:WPF支持所有WIndows媒体播放器支持的多媒体文件
- 样式和模板:对于现代具有皮肤软件具有重要意义
- 命令:可以将同一个命令映射到多个控件
- 声明式用户界面:通过编写修改XAML文件来修改创建界面
- 基于页面的应用程序:创建如浏览器一样的软件
与一般的Window应用程序相比较,WPF应用程序具有分辨率无关性,这样也就保证了WPF应用程序在换到不用分辨的显示器上显示的时候,可以保证与设计时的尺寸一直!这样就不会因为分辨率的问题导致用户界面发生控件大小的改变,飘移,或者消失的情况!
***WPF体系结构:
WPF使用一个多层的体系结构。在顶层,应用程序和一个完全由托管的C#代码编写的一组高层服务进行交互!至于将.Netd对象转换为Direct3D纹理和三角形的实际工作,是在后台由一个叫做milcore.dll的低级的非托管组件完成的!milcore.dll是使用非托管代码实现的,因为他需要和Direct3D紧密集成,并对他对性能非常敏感!
下图显示了WPF应用程序中各层的工作情况:
- PresentationFramework.dll 包含了WPF顶层的类型,包括那些表示窗口,面板以及其他类型控件的类型。开发人员直接使用的大部分类都来自这个程序集!
- PresentationCore.dll 包含了基础类型,比如UIElement类和Visual类,所有形状类和控件类均继承自这两个类!
- WindowsBase.dll 包含了更多的基本要素,这些要素具有在WPF外重用的潜能!
- milcore.dll 是WPF渲染系统的核心,也是媒体集成层的基础!其合成引擎将可视化元素转化为Direct3D所期望的三角形和纹理!
- WindowsCodecs.dll 是一套提供图像支持的低级API(例如,处理,显示以及缩放位图以及JPEG图像)
- Direct3D是一套低级的API,WPF应用程序中所有的图形都由它来渲染!
- Use32用于决定哪些程序实际占有桌面的哪一部分!它仍然被包含在WPF中,但是已经不再使用它来渲染通用控件!