《wpf开发教程》word版

上传人:xiao****1972 文档编号:70865154 上传时间:2019-01-18 格式:DOC 页数:259 大小:13.10MB
返回 下载 相关 举报
《wpf开发教程》word版_第1页
第1页 / 共259页
《wpf开发教程》word版_第2页
第2页 / 共259页
《wpf开发教程》word版_第3页
第3页 / 共259页
《wpf开发教程》word版_第4页
第4页 / 共259页
《wpf开发教程》word版_第5页
第5页 / 共259页
点击查看更多>>
资源描述

《《wpf开发教程》word版》由会员分享,可在线阅读,更多相关《《wpf开发教程》word版(259页珍藏版)》请在金锄头文库上搜索。

1、微软 WPF 应用 第 1 页 共 262 页 -WPF 开发教程 目录目录 WPF 基础入门基础入门3 1.WPF 基础之体系结构3 2.WPF 基础之 XAML.9 3.WPF 基础之基元素23 4.WPF 基础之属性系统26 5.WPF 基础之路由事件33 6.WPF 基础之布局系统46 7.WPF 基础之样式设置和模板化51 8.详谈 WPF 开发中的数据虚拟化.64 XAML 语法语法74 1.XAML 语法术语74 2.代码隐藏和 XAML82 3.XAML 和自定义类83 4.标记扩展和 XAML87 5.XAML 命名空间和命名空间映射90 6.WPF 名称范围92 WPF 控

2、件开发控件开发95 1.WPF 控件开发之控件概述95 2.使用 XAML 创建按钮.103 3.WPF 控件库之 BUTTON.114 4.WPF 控件库之 MENU115 5.WPF 控件库之 LABLE119 6.WPF 控件库之 TOOLBAR.121 7.WPF 控件开发之自定义控件124 8.WPF 控件开发之装饰器140 WPF 数据绑定数据绑定143 1.数据绑定概述.143 2.WPF 数据绑定之绑定源164 3.WPF 数据绑定之数据模板166 4.WPF 数据绑定之绑定声明181 5.实例一:绑定到 ADO.NET 数据源.184 6.实例二:绑定到 LINQ 查询的结果

3、.186 WPF 图形和多媒体开发图形和多媒体开发187 微软 WPF 应用 第 2 页 共 262 页 1.WPF 图形动画和媒体概述.187 2.WPF 的图形呈现191 3.WPF 的图像处理205 4.WPF 的三维图形应用219 5.WPF 的三维变换应用229 6.WPF 的动画开发238 7.WPF 的多媒体开发250 微软 WPF 应用 第 3 页 共 262 页 WPF 基础入门基础入门 1.1. WPFWPF 基础之体系结构基础之体系结构 本主题提供 Windows Presentation Foundation (WPF) 类层次结构的指导教程,涵盖 了 WPF 的大部分

4、主要子系统,并描述它们是如何交互的。本主题还详细介绍了 WPF 架构 师所做的一些选择。 System.ObjectSystem.Object WPF 主要编程模型是通过托管代码公开的。在 WPF 的早期设计阶段,曾有过大量关于 如何界定系统的托管组件和非托管组件的争论。CLR 提供一系列的功能,可以令开发效率 更高并且更加可靠(包括内存管理、错误处理和通用类型系统等),但这是需要付出代价 的。 下图说明了 WPF 的主要组件。关系图的红色部分 (PresentationFramework、PresentationCore 和 milcore)是 WPF 的主要代码部分。在 这些组件中,只有一

5、个是非托管组件 milcore。milcore 是以非托管代码编写的,目的 是实现与 DirectX 的紧密集成。WPF 中的所有显示是通过 DirectX 引擎完成的,可实现 高效的硬件和软件呈现。WPF 还要求对内存和执行进行精确控制。milcore 中的组合引擎 受性能影响关系大,需要放弃 CLR 的许多优点来提高性能。 本主题的后面部分将讨论 WPF 的托管和非托管部分之间的通信。下面介绍托管编程模型 的其余部分。 System.Threading.DispatcherObjectSystem.Threading.DispatcherObject 微软 WPF 应用 第 4 页 共 2

6、62 页 WPF 中的大多数对象是从 DispatcherObject 派生的,这提供了用于处理并发和线程 的基本构造。WPF 基于调度程序实现的消息系统。其工作方式与常见的 Win32 消息泵非常 类似;事实上,WPF 调度程序使用 User32 消息执行跨线程调用。 要讨论 WPF 中的并发,首先必须真正理解两个核心概念 调度程序和线程关联。 在 WPF 的设计阶段,目标趋向于单一线程的执行,但这不是一种与线程“关联的”模 型。当一个组件使用执行线程的标识来存储某种类型的状态时,将发生线程关联。最常见 的形式是使用线程本地存储 (TLS) 来存储状态。线程关联要求执行的每个逻辑线程仅由操

7、作系统中的一个物理线程所拥有,这将占用大量内存。最后,WPF 的线程处理模型保持与 具有线程关联的单一线程执行的现有 User32 线程处理模型同步。主要原因是互操作性 类似于 OLE 2.0 的系统、剪贴板和 Internet Explorer 均需要单一线程关联 (STA) 执行。 假设您具有带有 STA 线程的对象,则需要一种方式来在线程之间通信,并验证您是否 位于正确的线程上。调度程序的作用就在于此。调度程序是一个基本的消息调度系统,具 有多个按优先级排列的队列。消息的示例包括原始输入通知(鼠标移动)、框架函数(布 局)或用户命令(执行此方法)。通过从 DispatcherObject

8、 派生,您可以创建一个具有 STA 行为的 CLR 对象,并在创建时获得一个指向调度程序的指针。 System.Windows.DependencyObjectSystem.Windows.DependencyObject 生成 WPF 时使用的主要体系结构原理之一是首选属性而不是方法或事件。属性是声明性的, 使您更方便地指定意图而不是操作。它还支持模型驱动或数据驱动的系统,以显示用户界 面内容。这种理念的预期效果是创建您可以绑定到的更多属性,从而更好地控制应用程序 的行为。 为了从由属性驱动的系统获得更多,需要一个比 CLR 提供的内容更丰富的属性系统。 此丰富性的一个简单示例就是更改通知。

9、为了实现双向绑定,您需要绑定的双方支持更改 通知。为了使行为与属性值相关联,您需要在属性值更改时得到通知。Microsoft .NET Framework 具有一个 INotifyPropertyChange 接口,使对象可以发布更改通知(不过,这 是可选的)。 WPF 提供一个丰富的属性系统,该属性系统是从 DependencyObject 类型派生的。该 属性系统实际是一个“依赖”属性系统,因为它会跟踪属性表达式之间的依赖关系,并在 依赖关系更改时自动重新验证属性值。例如,如果您具有一个会继承的属性(如 FontSize),当继承该值的元素的父级发生属性更改时,会自动更新系统。 WPF 属

10、性系统的基础是属性表达式的概念。在 WPF 的第一版中,属性表达式系统是关 闭的,表达式都是作为框架的一部分提供的。表达式致使属性系统不具有硬编码的数据绑 定、样式调整或继承,而是由框架内后面的层来提供这些功能。 微软 WPF 应用 第 5 页 共 262 页 属性系统还提供属性值的稀疏存储。因为对象可以有数十个(如果达不到上百个)属 性,并且大部分值处于其默认状态(被继承、由样式设置等),所以并非对象的每个实例 都需要具有在该对象上定义的每个属性的完全权重。 属性系统的最后一个新功能是附加属性的概念。WPF 元素是基于组合和组件重用的原 则生成的。某些包含元素(如 Grid 布局元素)通常需

11、要子元素上的其他数据才能控制其 行为(如行/列信息)。任何对象都可以为任何其他对象提供属性定义,而不是要将所有这 些属性与每个元素相关联。这与 JavaScript 中的“expando”功能相似。 System.Windows.Media.VisualSystem.Windows.Media.Visual 定义一个系统后,下一步是将像素绘制到屏幕上。Visual 类用于生成可视化对象的树, 每个对象可以选择性地包含绘制指令以及有关如何呈现这些指令(剪辑、变换等)的元数 据。Visual 设计为极其轻量且灵活,所以大部分功能未进行 API 公开,并且极为依赖受 保护的回调函数。 Visual

12、实际上是到 WPF 组合系统的入口点。Visual 是以下两个子系统之间的连接点: 托管 API 和非托管 milcore。 WPF 通过遍历由 milcore 管理的非托管数据结构来显示数据。这些结构(称为组合节 点)代表层次结构显示树,其中每个节点都有呈现指令。只能通过消息传递协议来访问此 树(下图右侧所示)。 当对 WPF 编程时,您将创建 Visual 元素及派生的类型,它们通过此消息传递协议在 内部与此组合树进行通信。WPF 中的每个 Visual 可以不创建组合节点,也可以创建一个 或多个组合节点。 请注意一个非常重要的体系结构细节 可视对象和绘制指令的整个树都要进行缓存。 在图形

13、方面,WPF 使用一个保留的呈现系统。这可以使系统以一个高刷新率重绘系统,并 且不会发生组合系统阻止对用户代码的回调。这有助于防止出现应用程序无响应的情况。 关系图中不十分引人注意的另一个重要细节是系统实际上如何执行组合。 在 User32 和 GDI 中,系统是在一个即时模式剪辑系统上工作。当需要呈现一个组件 时,系统会建立一个剪辑边界,不允许组件接触该边界之外的像素,然后会要求此组件在 微软 WPF 应用 第 6 页 共 262 页 该框中绘制像素。此系统在内存受限的系统上工作良好,因为当某些内容更改时,只需要 处理受影响的组件即可 不会有两个组件对一个像素的颜色更改起作用。 WPF 使用

14、“绘画器的算法”绘制模型。这意味着并不是剪辑每个组件,而是要求从显 示内容的背面至正面来呈现每个组件。这允许每个组件在先前的组件的显示内容上绘制。 此模型的优点是您可以生成部分透明的复杂形状。与现今的现代图形硬件比较,此模型相 对要快(创建 User32/ GDI 的情况除外)。 如上面所述,WPF 的一个核心原理是移动到一个更具声明性且“以属性为核心”的编 程模型。在可视化系统中,这会表现为需要关注的两种情况。 首先,如果您考虑保留的模式图形系统,则实际上是从命令性 DrawLine/DrawLine 类 型模型移动到面向数据的模型 new Line()/new Line()。通过这一向数据

15、驱动的呈现移动, 可以在使用属性表达的绘制指令上进行复杂的操作。从 Drawing 派生的类型实际上是用于 呈现的对象模型。 第二,如果评估动画系统,您将看到它几乎是完全声明性的。无需要求开发人员计算 下一位置或下一颜色,您可以将动画表示为动画对象上的一组属性。于是,这些动画可以 表示开发人员或设计人员的意图(在 5 秒内将此按钮从一个位置移动到另一个位置),系 统就可以确定完成此任务的最有效方式。 System.Windows.UIElementSystem.Windows.UIElement UIElement 定义核心子系统,包括 Layout、Input 和 Event。 Layout

16、 是 WPF 中的一个核心概念。在许多系统中,可能有一组固定的布局模型 (HTML 支持三种布局模型:流、绝对和表),也可能没有布局模型(User32 实际仅支持 绝对定位)。WPF 先假设开发人员和设计人员希望有一个灵活的可扩展布局模型,该模型 可能是由属性值而不是命令性逻辑驱动的。在 UIElement 级别,会引入布局的基本协定 - 具有 Measure 和 Arrange 处理过程的两阶段模型。 Measure 允许组件确定它要采用的大小。此阶段独立于 Arrange,因为在许多情形下, 父元素会要求子元素测量若干次以确定其最佳位置和大小。父元素要求子元素测量这一事 实体现了 WPF 的另一关键原则 内容大小。WPF 中的所有控件支持调整到内容原始大小 的功能。这使本地化更加容易,并允许在调整大小时对元素进行动态布局。Arrange 阶段 允许父元素定位并确定每个子元素的最终大小。 通常会花费大量的时间来讨论 WPF 的输出端(Visual 及其相关对象)。然而,在输 入端也有许多创新。WPF 输入模型的最基本更改也许是一致模型,输入事件通过系

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号