微信扫码下载

内容简介

  WPF提供了为Windows操作系统构建高品质用户界面的开发框架,融合了源于多个渠道的丰富内容,为您充分利用Windows计算机的处理能力提供了前所未有的机会。
  《.NET开发经典名著·WPF编程宝典:使用C#2012和.NET4.5(第4版)》全面讲解WPF的实际工作原理,是一本WPF专业著作。在紧贴实用示例这一思想的引导下,列出实用提示,引导以专业的方式使用WPF。《.NET开发经典名著·WPF编程宝典:使用C#2012和.NET4.5(第4版)》开篇介绍WPF基本概念以便为您奠定坚实的基础,并将现有C#技能作为引用框架,然后讨论高级概念,结合实际演示它们的用法,并重点强调了可由此节省的时间和人力成本。
  主要内容:
  ·理解WPF编程的基础知识:从XAML到控件,乃至数据流;
  ·开发实用的应用程序,带您实际了解导航、本地化和开发;
  ·探讨WPF提供的高级用户界面控件;
  ·分析如何在WPF中管理文档,涵盖了文本布局、打印和文档打包等所有技术;
  ·使用图形和多媒体来增强应用程序。

作者简介

  麦克唐纳(MatthewMacDonald),是一位作家、教育家,也是微软最有价值专家。他撰写了十多本有关.NET编程的书籍,包括ProSilverlight3inC#(2009年Apress出版)和ProASP.NET3.5inC#(2007年Apress出版)以及《WPF编程宝典:使用C# 2012和.NET 4.5(第4版)》的前一版本。目前他与妻子以及两个女儿居住在多伦多。

目录

第Ⅰ部分基础知识
第1章WPF概述
1.1Windows图形演化
1.1.1DirectX:新的图形引擎
1.1.2硬件加速与WPF
1.2WPF:高级API
1.3分辨率无关性
1.3.1WPF单位
1.3.2系统DPI
1.3.3位图和矢量图形
1.4WPF体系结构
1.5WPF4.5
1.5.1WPF工具包
1.5.2VisualStudio2012
1.6小结
第2章XAML
2.1理解XAML
2.1.1WPF之前的图形用户界面
2.1.2XAML变体
2.1.3XAML编译
2.2XAML基础
2.2.1XAML名称空间
2.2.2代码隐藏类
2.3XAML中的属性和事件
2.3.1简单属性与类型转换器
2.3.2复杂属性
2.3.3标记扩展
2.3.4附加属性
2.3.5嵌套元素
2.3.6特殊字符与空白
2.3.7事件
2.3.8完整的EightBallAnswer示例
2.4使用其他名称空间中的类型
2.5加载和编译XAML
2.5.1只使用代码
2.5.2使用代码和未经编译的XAML
2.5.3使用代码和编译过的XAML
2.5.4只使用XAML
2.6小结
第3章布局
3.1理解WPF中的布局
3.1.1WPF布局原则
3.1.2布局过程
3.1.3布局容器
3.2使用StackPanel面板进行简单布局
3.2.1布局属性
3.2.2对齐方式
3.2.3边距
3.2.4最小尺寸、最大尺寸以及显式地设置尺寸
3.2.5Border控件
3.3WrapPanel和DockPanel面板
3.3.1WrapPanel面板
3.3.2DockPanel面板
3.3.3嵌套布局容器
3.4Grid面板
3.4.1调整行和列
3.4.2布局舍入
3.4.3跨越行和列
3.4.4分割窗口
3.4.5共享尺寸组
3.4.6UniformGrid面板
3.5使用Canvas面板进行基于坐标的布局
3.5.1Z顺序
3.5.2lnkCanvas元素
3.6布局示例
3.6.1列设置
3.6.2动态内容
3.6.3组合式用户界面
3.7小结
第4章依赖项属性
4.1理解依赖项属性
4.1.1定义依赖项属性
4.1.2注册依赖项属性
4.1.3添加属性包装器
4.1.4WPF使用依赖项属性的方式
4.1.5共享的依赖项属性
4.1.6附加的依赖项属性
4.2属性验证
4.2.1验证回调
4.2.2强制回调
4.3小结
第5章路由事件
5.1理解路由事件
5.1.1定义、注册和封装路由事件
5.1.2共享路由事件
5.1.3引发路由事件
5.1.4处理路由事件
5.2事件路由
5.2.1RoutedEventArgs类
5.2.2冒泡路由事件
5.2.3处理挂起的事件
5.2.4附加事件
5.2.5隧道路由事件
5.3WPF事件
5.3.1生命周期事件
5.3.2输入事件
5.4键盘输入
5.4.1处理按键事件
5.4.2焦点
5.4.3获取键盘状态
5.5鼠标输入
5.5.1鼠标单击
5.5.2捕获鼠标
5.5.3鼠标拖放
5.6多点触控输入
5.6.1多点触控的输入层次
5.6.2原始触控
5.6.3操作
5.6.4惯性
5.7小结

第Ⅱ部分进一步研究WPF
第6章控件
6.1控件类
6.1.1背景画刷和前景画刷
6.1.2字体
6.1.3鼠标光标
6.2内容控件
6.2.1Content属性
6.2.2对齐内容
6.2.3WPF内容原则
6.2.4标签
6.2.5按钮
6.2.6工具提示
6.3特殊容器
6.3.1ScrollViewer
6.3.2GroupBox
6.3.3TabItem
6.3.4Expander
6.4文本控件
6.4.1多行文本
6.4.2选择文本
6.4.3拼写检查
6.4.4PasswordBox
6.5列表控件
6.5.1ListBox
6.5.2ComboBox
6.6基于范围的控件
6.6.1Slider
6.6.2ProgressBar
6.7日期控件
6.8小结
第7章Application类
7.1应用程序的生命周期
7.1.1创建Application对象
7.1.2派生自定义的Application类
7.1.3应用程序的关闭方式
7.1.4应用程序事件
7.2Application类的任务
7.2.1显示初始界面
7.2.2处理命令行参数
7.2.3访问当前Application对象
7.2.4在窗口之间进行交互
7.2.5单实例应用程序
7.3程序集资源
7.3.1添加资源
7.3.2检索资源
7.3.3packURI
7.3.4内容文件
7.4本地化
7.4.1构建能够本地化的用户界面
7.4.2使应用程序为本地化做好准备
7.4.3管理翻译过程
7.5小结
第8章元素绑定
8.1将元素绑定到一起
8.1.1绑定表达式
8.1.2绑定错误
8.1.3绑定模式
8.1.4使用代码创建绑定
8.1.5使用代码检索绑定
8.1.6多绑定
8.1.7绑定更新
8.1.8绑定延迟
8.2绑定到非元素对象
8.2.1Source属性
8.2.2RelativeSource属性
8.2.3DataContext属性
8.3小结
第9章命令
9.1理解命令
9.2WPF命令模型
9.2.1ICommand接口
9.2.2RoutedCommand类
9.2.3RoutedUICommand类
9.2.4命令库
9.3执行命令
9.3.1命令源
9.3.2命令绑定
9.3.3使用多命令源
9.3.4微调命令文本
9.3.5直接调用命令
9.3.6禁用命令
9.3.7具有内置命令的控件
9.4高级命令
9.4.1自定义命令
9.4.2在不同位置使用相同的命令
9.4.3使用命令参数
9.4.4跟踪和翻转命令
9.5小结
第10章资源
10.1资源基础
10.1.1资源集合
10.1.2资源的层次
10.1.3静态资源和动态资源
10.1.4非共享资源
10.1.5通过代码访问资源
10.1.6应用程序资源
10.1.7系统资源
10.2资源字典
10.2.1创建资源字典
10.2.2使用资源字典
10.2.3在程序集之间共享资源
10.3小结
第11章样式和行为
11.1样式基础
11.1.1创建样式对象
11.1.2设置属性
11.1.3关联事件处理程序
11.1.4多层样式
11.1.5通过类型自动应用样式
11.2触发器
11.2.1简单触发器
11.2.2事件触发器
11.3行为
11.3.1获取行为支持
11.3.2理解行为模型
11.3.3创建行为
11.3.4使用行为
11.3.5Blend中的设计时行为支持
11.4小结

第Ⅲ部分图画和动画
第12章形状、画刷和变换
12.1理解形状
12.1.1Shape类
12.1.2矩形和椭圆
12.1.3改变形状的尺寸和放置形状
12.1.4使用Viewbox控件缩放形状
12.1.5直线
12.1.6折线
12.1.7多边形
12.1.8直线线帽和直线交点
12.1.9点划线
12.1.10像素对齐
12.2画刷
12.2.1SolidColorBrush画刷
12.2.2LinearGradientBrush画刷
12.2.3RadialGradientBrush画刷
12.2.4ImageBrush画刷
12.2.5平铺的ImageBrush画刷
12.2.6VisualBrush画刷
12.2.7BitmapCacheBrush画刷
12.3变换
12.3.1变换形状
12.3.2变换元素
12.4透明
12.4.1使元素半透明
12.4.2透明掩码
12.5小结
第13章几何图形和图画
13.1路径和几何图形
13.1.1直线、矩形和椭圆图形
13.1.2使用GeometryGroup组合形状
13.1.3使用CombinedGeometry融合几何图形
13.1.4使用PathGeometry绘制曲线和直线
13.1.5微语言几何图形
13.1.6使用几何图形进行剪裁
13.2图画
13.2.1显示图画
13.2.2导出插图
13.3小结
第14章效果和可视化对象
14.1可视化对象
14.1.1绘制可视化对象
14.1.2在元素中封装可视化对象
14.1.3命中测试
14.1.4复杂的命中测试
14.2效果
14.2.1BlurEffect类
14.2.2DropShadowEffect类
14.2.3ShaderEffect类
14.3WriteableBitmap类
14.3.1生成位图
14.3.2写入WriteableBitmap对象
14.3.3更高效的像素写入
14.4小结
第15章动画基础
15.1理解WPF动画
15.1.1基于时间的动画
15.1.2基于属性的动画
15.2基本动画
15.2.1Animation类
15.2.2使用代码创建动画
15.2.3同时发生的动画
15.2.4动画的生命周期
15.2.5Timeline类
15.3故事板
15.3.1故事板
15.3.2事件触发器
15.3.3重叠动画
15.3.4同步的动画
15.3.5控制播放
15.3.6监视动画进度
15.4动画缓动
15.4.1使用缓动函数
15.4.2在动画开始时应用缓动与在动画结束时应用缓动
15.4.3缓动函数类
15.4.4创建自定义缓动函数
15.5动画性能
15.5.1期望的帧率
15.5.2位图缓存
15.6小结
第16章高级动画
16.1动画类型回顾
16.1.1动态变换
16.1.2动态改变画刷
16.1.3动态改变像素着色器
16.2关键帧动画
16.2.1离散的关键帧动画
16.2.2缓动关键帧
16.2.3样条关键帧动画
16.3基于路径的动画
16.4基于帧的动画
16.5使用代码创建故事板
16.5.1创建主窗口
16.5.2创建Bomb用户控件
16.5.3投弹
16.5.4拦截炸弹
16.5.5统计炸弹和清理工作
16.6小结

第Ⅳ部分模板和自定义元素
第17章控件模板
17.1理解逻辑树和可视化树
17.2理解模板
17.2.1修饰类
17.2.2剖析控件
17.3创建控件模板
17.3.1简单按钮
17.3.2模板绑定
17.3.3改变属性的触发器
17.3.4使用动画的触发器
17.4组织模板资源
17.4.1分解按钮控件模板
17.4.2通过样式应用模板
17.4.3自动应用模板
17.4.4由用户选择的皮肤
17.5构建更复杂的模板
17.5.1嵌套的模板
17.5.2修改滚动条
17.5.3控件模板示例
17.6可视化状态
17.7小结
第18章自定义元素
18.1理解WPF中的自定义元素
18.2构建基本的用户控件
18.2.1定义依赖项属性
18.2.2定义路由事件
18.2.3添加标记
18.2.4使用控件
18.2.5命令支持
18.2.6深入分析用户控件
18.3创建无外观控件
18.3.1修改颜色拾取器的代码
18.3.2修改颜色拾取器的标记
18.3.3精简控件模板
18.4支持可视化状态
18.4.1开始编写FlipPanel类
18.4.2选择部件和状态
18.4.3默认控件模板
18.4.4使用FlipPanel控件
18.4.5使用不同的控件模板
18.5创建自定义面板
18.5.1两步布局过程
18.5.2Canvas面板的副本
18.5.3更好的WrapPanel面板
18.6自定义绘图元素
18.6.1OnRender()方法
18.6.2评估自定义绘图
18.6.3自定义绘图元素
18.6.4创建自定义装饰元素
18.7小结

第Ⅴ部分数据
第19章数据绑定
19.1使用自定义对象绑定到数据库
19.1.1构建数据访问组件
19.1.2构建数据对象
19.1.3显示绑定对象
19.1.4更新数据库
19.1.5更改通知
19.2绑定到对象集合
19.2.1显示和编辑集合项
19.2.2插入和移除集合项
19.2.3绑定到ADO.NET对象
19.2.4绑定到LINQ表达式
19.3提高大列表的性能
19.3.1虚拟化
19.3.2项容器再循环
19.3.3缓存长度
19.3.4延迟滚动
19.4验证
19.4.1在数据对象中进行验证
19.4.2自定义验证规则
19.4.3响应验证错误
19.4.4获取错误列表
19.4.5显示不同的错误指示符号
19.4.6验证多个值
19.5数据提供者
19.5.1ObjectDataProvider
19.5.2XmlDataProvider
19.6小结
第20章格式化绑定的数据
20.1数据绑定回顾
20.2数据转换
20.2.1使用StringFormat属性
20.2.2值转换器简介
20.2.3使用值转换器设置字符串的格式
20.2.4使用值转换器创建对象
20.2.5应用条件格式化
20.2.6评估多个属性
20.3列表控件
20.4列表样式
20.4.1ItemContainerStyle
20.4.2包含复选框或单选按钮的ListBox控件
20.4.3交替条目样式
20.4.4样式选择器
20.5数据模板
20.5.1分离和重用模板
20.5.2使用更高级的模板
20.5.3改变模板
20.5.4模板选择器
20.5.5模板与选择
20.5.6改变项的布局
20.6ComboBox控件
20.7小结
第21章数据视图
21.1View对象
21.1.1检索视图对象
21.1.2视图导航
21.1.3以声明方式创建视图
21.2过滤、排序与分组
21.2.1过滤集合
21.2.2过滤DataTable对象
21.2.3排序
21.2.4分组
21.2.5实时成型
21.3小结
第22章列表、树和网格
22.1ListView控件
22.1.1使用GirdView创建列
22.1.2创建自定义视图
22.2TreeView控件
22.2.1创建数据绑定的TreeView控件
22.2.2将DataSet对象绑定到TreeView控件
22.2.3即时创建节点
22.3DataGrid控件
22.3.1改变列的尺寸与重新安排列
22.3.2定义列
22.3.3设置列的格式和样式
22.3.4设置行的格式
22.3.5显示行细节
22.3.6冻结列
22.3.7选择
22.3.8排序
22.3.9编辑
22.4小结

第Ⅵ窗口、页面和富控件
第23章窗口
23.1Window类
23.1.1显示窗口
23.1.2定位窗口
23.1.3保存和还原窗口位置
23.2窗口交互
23.2.1窗口所有权
23.2.2对话框模型
23.2.3通用对话框
23.3非矩形窗口
23.3.1简单形状窗口
23.3.2具有形状内容的透明窗口
23.3.3移动形状窗口
23.3.4改变形状窗口的尺寸
23.3.5组合到一起:窗口的自定义控件模板
23.4Windows7任务栏编程
23.4.1使用跳转列表
23.4.2改变任务栏图标和预览
23.5小结
第24章页面和导航
24.1基于页面的导航
24.2基于页面的界面
24.2.1创建一个具有导航窗口的基于页面的简单应用程序
24.2.2Page类
24.2.3超链接
24.2.4在框架中驻留页面
24.2.5在另一个页面中驻留页面
24.2.6在Web浏览器中驻留页面
24.3页面历史
24.3.1深入分析WPF中的URI
24.3.2导航历史
24.3.3维护自定义的属性
24.4导航服务
24.4.1通过编程进行导航
24.4.2导航事件
24.4.3管理日志
24.4.4向日志添加自定义项
24.4.5使用页函数
24.5XAML浏览器应用程序
24.5.1创建XBAP应用程序
24.5.2部署XBAP应用程序
24.5.3更新XBAP应用程序
24.5.4XBAP应用程序的安全性
24.5.5完全信任的XBAP应用程序
24.5.6组合XBAP/独立应用程序
24.5.7为不同的安全级别编写代码
24.5.8在网页中嵌入XBAP应用程序
24.6WebBrowser控件
24.6.1导航到页面
24.6.2构建DOM树
24.6.3使用.NET代码为网页添加脚本
24.7小结
第25章菜单、工具栏和功能区
25.1菜单
25.1.1Menu类
25.1.2菜单项
25.1.3ContextMenu类
25.1.4菜单分隔条
25.2工具栏和状态栏
25.2.1ToolBar控件
25.2.2StatusBar控件
25.3功能区
25.3.1添加功能区
25.3.2应用程序菜单
25.3.3选项卡、组与按钮
25.3.4富工具提示
25.3.5带有快捷键提示的键盘访问
25.3.6改变功能区的大小
25.3.7快速访问工具栏
25.4小结
第26章声音和视频
26.1播放WAV音频
26.1.1SoundPlayer类
26.1.2SoundPlayerAction类
26.1.3系统声音
26.2MediaPlayer类
26.3MediaElement类
26.3.1使用代码播放音频
26.3.2处理错误
26.3.3使用触发器播放音频
26.3.4播放多个声音
26.3.5改变音量、平衡、速度以及位置
26.3.6将动画同步到音频
26.3.7播放视频
26.3.8视频效果
26.4语音
26.4.1语音合成
26.4.2语音识别
26.5小结
第27章3D绘图
27.13D绘图基础
27.1.1视口
27.1.23D对象
27.1.3摄像机
27.2深入研究3D绘图
27.2.1着色和法线
27.2.2更复杂的形状
27.2.3Model3DGroup集合
27.2.4使用材质
27.2.5纹理映射
27.3交互和动画
27.3.1变换
27.3.2旋转
27.3.3飞过
27.3.4跟踪球
27.3.5命中测试
27.3.63D表面上的2D元素
27.4小结

第Ⅶ部分文档和打印
第28章文档
28.1理解文档
28.2流文档
28.2.1流内容元素
28.2.2设置内容元素的格式
28.2.3创建简单的流文档
28.2.4块元素
28.2.5内联元素
28.2.6通过代码与元素进行交互
28.2.7文本对齐
28.3只读流文档容器
28.3.1缩放
28.3.2创建页面和列
28.3.3从文件加载文档
28.3.4打印
28.4编辑流文档
28.4.1加载文件
28.4.2保存文件
28.4.3设置所选文本的格式
28.4.4获取单个单词
28.5固定文档
28.6批注
28.6.1批注类
28.6.2启用批注服务
28.6.3创建批注
28.6.4检查批注
28.6.5响应批注更改
28.6.6在固定文档中保存批注
28.6.7自定义便签的外观
28.7小结
第29章打印
29.1基本打印
29.1.1打印元素
29.1.2变换打印输出
29.1.3打印不显示的元素
29.1.4打印文档
29.1.5在文档打印输出中控制页面
29.2自定义打印
29.2.1使用可视化层中的类进行打印
29.2.2自定义多页打印
29.3打印设置和管理
29.3.1保存打印设置
29.3.2打印页面范围
29.3.3管理打印队列
29.4通过XPS进行打印
29.4.1为打印预览创建XPS文档
29.4.2写入内存的XPS文档
29.4.3通过XPS直接打印到打印机
29.4.4异步打印
29.5小结

第Ⅷ部分其他主题
第30章与Windows窗体进行交互
30.1访问互操作性
30.2混合窗口和窗体
30.2.1为WPF应用程序添加窗体
30.2.2为Windows窗体应用程序添加WPF窗口
30.2.3显示模态窗口和窗体
30.2.4显示非模态窗口和窗体
30.2.5启用Windows窗体控件的可视化风格
30.3创建具有混合内容的窗口
30.3.1WPF和Windows窗体“空域”
30.3.2在WPF中驻留Windows窗体控件
30.3.3使用WPF和Windows窗体用户控件
30.3.4在Windows窗体中驻留WPF控件
30.3.5访问键、助记码和焦点
30.3.6属性映射
30.4小结
第31章多线程
31.1了解多线程模型
31.1.1Dispatcher类
31.1.2DispatcherObject类
31.2BackgroundWorker类
31.2.1简单的异步操作
31.2.2创建BackgroundWorker对象
31.2.3运行BackgroundWorker对象
31.2.4跟踪进度
31.2.5支持取消
31.3小结
第32章插件模型
32.1在MAF和MEF两者间进行选择
32.2了解插件管道
32.2.1管道的工作原理
32.2.2插件文件夹结构
32.2.3为使用插件模型准备解决方案
32.3创建使用插件模型的应用程序
32.3.1协定
32.3.2插件视图
32.3.3插件
32.3.4插件适配器
32.3.5宿主视图
32.3.6宿主适配器
32.3.7宿主
32.3.8更多插件
32.4与宿主进行交互
32.5可视化插件
32.6小结
第33章ClickOnce部署
33.1理解应用程序部署
33.1.1ClickOnce安装模型
33.1.2ClickOnce部署的局限性
33.2简单的ClickOnce发布
33.2.1设置发布者和产品
33.2.2启动发布向导
33.2.3理解部署文件的结构
33.2.4安装ClickOnce应用程序
33.2.5更新ClickOnce应用程序
33.3ClickOnce附加选项
33.3.1发布版本
33.3.2更新
33.3.3文件关联
33.3.4发布选项
33.4小结

精彩书摘

正如您已经知道的,放在WPF窗口中的所有要素都在一定层次上继承自UIElement类,包括Label、StackPanel、TextBlock和Image。UIElement定义了一些核心事件。例如,每个继承自UIElement的类都提供MouseDown事件和MouseUp事件。
但当单击上面这个特殊标签中的图像部分时,想一想会发生什么事情。很明显,引发Image.mouseDown,事件和Image.MouseUp事件是合情合理的。但如果希望采用相同的方式来处理标签上的所有单击事件,该怎么办呢?此时,不管用户单击了图像、某块文本还是标签内的空白处,都应当使用相同的代码进行响应。
显然,可为每个元素的MouseDown或MouseUp事件关联同一个事件处理程序,但这样会使标记变得杂乱无章且难以维护。WPF使用路由事件模型提供了一个更好的解决方案。路由事件实际上以下列三种方式出现:
与普通.NET事件类似的直接路由事件(directevent)。它们源于一个元素,不传递给其他元素。例如,MouseEnter事件(当鼠标指针移到元素上时发生)是直接路由事件。
在包含层次中向上传递的冒泡路由事件(bubblingevent)。例如,MouseDown事件就是昌泡路由事件。该事件首先由被单击的元素引发,接下来被该元素的父元素引发,然后被父元素的父元素引发,依此类推,直到WPF到达元素树的顶部为止。
在包含层次中向下传递的隧道路由事件(tunnelingevent)。隧道路由事件在事件到达恰当的控件之前为预览事件(甚至终止事件)提供了机会。例如,通过PreviewKeyDown事件可截获是否按下了某个键。首先在窗口级别上,然后是更具体的容器,直至到达当按下键时具有焦点的元素。
当使用EventManager.RegisterEvent()方法注册路由事件时,需要传递一个RoutingStrategy枚举值,该值用于指示希望应用于事件的事件行为。

其他推荐