第1章 Windows Phone应用的开发准备 1
1.1 安装Windows Phone开发环境 1
1.2 开发环境介绍 3
1.3 受欢迎的第三方工具 7
1.4 值得一去的网站 10
1.5 经验分享与思考 11
第2章 创建一个“Hello World”应用 12
2.1 可以创建的应用类型 12
2.2 可以采用的编程语言 14
2.3 创建一个简单的新闻阅读器 15
2.4 经验分享与思考 19
第3章 一个故事的开始——设计我的课程应用原型 20
3.1 课程应用的需求分析 20
3.2 设计课程表 21
3.2.1 查看课程 21
3.2.2 新建和编辑课程 21
3.3 设计笔记本 23
3.3.1 查看笔记 23
3.3.2 新建和编辑笔记 25
3.4 设计作业本 25
3.4.1 查看作业 25
3.4.2 新建和编辑作业 27
3.5 整合同一门课程的信息 27
3.6 搜索信息 28
3.7 同步数据到远程服务器 29
3.8 设置应用 31
3.9 设计主页 31
3.10 理清页面之间的关系 33
3.11 经验分享与思考 34
第4章 创建课程表——应用MWM模式 36
4.1 创建Windows Phone Panorama Application项目 36
4.2 MVVM模式概述 37
4.3 创建课程表页面 37
4.3.1 创建Pivot页面 38
4.3.2 从XML文件导入课程示例数据 38
4.3.3 通过Data面板创建课程ListBox控件 40
4.3.4 修改列表项的模板 40
4.3.5 添加Application Bar 43
4.3.6 添加上下文菜单 44
4.3.7 让课程表页面暂代启动页面一职 45
4.4 创建新建/编辑课程页面 45
4.4.1 创建页面 45
4.4.2 使用AutoCompleteBox控件和TimePicker控件 46
4.4.3 添加Application Bar 49
4.4.4 从课程表页面打开新建/编辑课程页面 50
4.5 创建课程页面 51
4.5.1 创建Panorama页面 51
4.5.2 使用LongListSelector控件 52
4.5.3 从课程表页面打开课程页面 53
4.6 测试应用 55
4.7 创建课程模型 56
4.7.1 创建Course类 56
4.7.2 应用TableAttribute和ColumnAttribute 57
4.7.3 实现INotifyPropertyChanged接口 58
4.7.4 提高LINQ to SQL的更新性能 59
4.8 通过LINQ to SQL创建本地数据库 60
4.8.1 创建强类型DataContext类 60
4.8.2 创建本地数据库 61
4.9 创建课程表视图模型 62
4.9.1 创建CourseListViewModel类 63
4.9.2 创建TimetableViewModel类 63
4.10 创建新建/编辑课程视图模型 65
4.11 创建本周安排视图模型 70
4.12 把一切连起来 72
4.12.1 创建时间转换器和星期转换器 72
4.12.2 在绑定表达式里使用转换器 73
4.12.3 创建和使用Pivot项的数据模板 74
4.12.4 通过查询字符串的参数传递所需的信息 75
4.12.5 实现课程表页面的删除操作 77
4.12.6 解析和使用查询字符串的参数 77
4.12.7 设置数据绑定 78
4.12.8 实现新建/编辑课程页面的提交和撤销操作 79
4.13 测试应用 80
4.14 经验分享与思考 84
第5章 创建笔记本——实现REST风格的页面导航 86
5.1 创建笔记本页面 86
5.1.1 创建Pivot页面 86
5.1.2 创建示例数据 87
5.1.3 创建今天笔记列表 89
5.1.4 创建重点笔记列表 92
5.1.5 创建标签列表和日期列表 94
5.2 创建笔记列表页面 95
5.3 创建新建/编辑笔记页面 96
5.4 添加今天重点板块 97
5.4.1 通过Grid布局今天重点板块 97
5.4.2 使用RoundButton控件 98
5.4.3 创建横跨两个单元格的ListBox控件 99
5.5 添加上下文菜单 99
5.6 通过行为实现打开页面的操作 100
5.6.1 通过Navigate to菜单实现打开页面的操作 100
5.6.2 为上下文菜单添加NavigateToPageAction 102
5.6.3 使用ApplicationBarButtonNavigation 103
5.7 测试应用 104
5.8 创建笔记模型 107
5.9 实现REST风格的页面导航 108
5.9.1 Windows Phone的导航框架 109
5.9.2 封装Navigate方法 110
5.9.3 设计REST风格的导航URI 111
5.9.4 使用UriMapper定义REST风格的导航URI 112
5.10 创建笔记本视图模型 113
5.10.1 创建NoteViewModel类 113
5.10.2 创建TagViewModel类 115
5.10.3 创建DateViewModel类 116
5.10.4 创建NotebookViewModel类 117
5.11 创建笔记列表视图模型 120
5.12 创建新建/编辑笔记视图模型 123
5.13 创建今天重点视图模型 125
5.14 刷新列表里的数据 126
5.14.1 实现INotifyPropertyChanged接口 126
5.14.2 通过Messenger.Send方法发送刷新消息 127
5.14.3 通过Messenger.Register方法订阅刷新消息 128
5.14.4 通过编译查询特性避免重复翻译LINQ to SQL语句 129
5.15 把一切连起来 131
5.15.1 控制图片的显示状态 131
5.15.2 创建AppBarButtonCommand 133
5.15.3 为Application Bar上的按钮绑定命令对象 135
5.15.4 设置数据绑定 135
5.15.5 关联视图模型到页面 137
5.16 测试应用 138
5.17 经验分享与思考 143
第6章 创建作业本——通过消息实现松散耦合 145
6.1 创建作业模型 145
6.2 创建作业本视图模型 146
6.3 创建新建/编辑作业视图模型 149
6.4 创建今天未完成作业视图模型 151
6.5 创建作业列表视图模型 152
6.6 通过消息使各个部分松散耦合 153
6.6.1 创建SentNotificationAction 154
6.6.2 在视图模型里订阅和处理消息 155
6.6.3 在数据库里订阅和处理消息 159
6.7 创建作业本页面 160
6.7.1 创建Pivot页面 160
6.7.2 创建作业示例数据 161
6.7.3 创建今天作业列表 162
6.7.4 通知数据库更新作业的完成状态 165
6.7.5 应用作业模板和日期模板 165
6.7.6 设置各作业列表的数据绑定 166
6.8 创建作业列表页面 167
6.8.1 创建页面 167
6.8.2 使用NavigateWithQueryStringAction打开作业列表页面 168
6.9 创建新建/编辑作业页面 169
6.9.1 创建页面 169
6.9.2 添力Application Bar 170
6.9.3 设置按钮个数 172
6.9.4 使用NavigateWithQueryStringAction打开新建/编辑作业页面 172
6.10 在课程页面添加今天作业板块 173
6.10.1 通过Grid布局今天作业板块 173
6.10.2 在RoundButton控件上使用NavigateWithQueryStringAction打开页面 174
6.11 添加上下文菜单 174
6.12 把一切连起来 175
6.13 测试应用 177
6.14 调整截止日期的显示格式 179
6.14.1 创建截止日期转换器 179
6.14.2 测试应用 180
6.15 修正集合视图的筛选/排序问题 181
6.15.1 评估影响 181
6.15.2 着手修正 182
6.15.3 测试应用 184
6.16 改善用户体验 185
6.16.1 使新建/编辑作业页面支持横屏模式 185
6.16.2 使文本框在进入编辑状态时自动全选 186
6.16.3 防止用户提交空白的作业内容 188
6.16.4 为页面切换添加翻页动画 190
6.16.5 通过动画描绘删除操作 191
6.17 经验分享与思考 193
第7章 创建主页——Live Tiles+多任务 194
7.1 创建主页 194
7.1.1 清理主页 194
7.1.2 添加板块 195
7.1.3 实现主页的Tile 196
7.1.4 布局课程板块 196
7.1.5 布局笔记和作业两个板块 198
7.1.6 布局工具板块 199
7.1.7 让主页恢复启动页面一职 200
7.2 使图标的颜色与主题兼容 200
7.3 创建Tile视图模型 201
7.3.1 创建继承体系 202
7.3.2 计算属性的值 203
7.4 创建主页视图模型 206
7.4.1 初始化Tile视图模型 206
7.4.2 初始化统计列表项视图模型 208
7.4.3 加载主页 211
7.5 把一切连起来 212
7.5.1 设置数据绑定 212
7.5.2 设置控件行为 214
7.6 测试应用 215
7.7 通过行为实现打开页面的操作 218
7.7.1 添加页面导航行为 218
7.7.2 修改视图模型 220
7.7.3 启用TiltEffect效果 221
7.8 测试应用 222
7.9 固定今天课程Tile到“开始”屏幕 223
7.9.1 设计“开始”屏幕的今天课程Tile 223
7.9.2 通过命令对象实现固定到“开始”屏幕 223
7.9.3 添加上下文菜单 225
7.10 测试应用 225
7.11 通过后台任务更新Tile 227
7.11.1 分离模型层 227
7.11.2 添加后台任务项目 228
7.11.3 注册后台任务 230
7.11.4 调试后台任务 231
7.12 测试应用 232
7.13 经验分享与思考 234
第8章 内容搜索——测试驱动开发 235
8.1 创建和运行测试项目 235
8.2 添加测试代码 238
8.3 创建搜索视图模型 239
8.4 搜索空的数据库 241
8.5 搜索课程 242
8.5.1 创建上下文 242
8.5.2 应该只有一条搜索结果 244
8.5.3 应该每周有四节课 246
8.5.4 应该根据星期和时间排序课程安排 247
8.6 搜索笔记和作业 249
8.6.1 创建上下文 249
8.6.2 应该只有一条搜索结果 250
8.6.3 应该包含三条笔记 251
8.6.4 应该根据重点和时间排序笔记内容 252
8.7 缺少搜索关键字 254
8.8 管理测试代码 255
8.9 创建搜索页面 256
8.9.1 创建页面和绑定视图模型 257
8.9.2 添加搜索框 258
8.9.3 执行搜索操作 260
8.9.4 在视图模型里创建示例数据 261
8.9.5 显示搜索结果 263
8.10 为课程搜索结果创建数据模板 265
8.10.1 为ListBox控件创建ItemTemplate 265
8.10.2 为ExpanderView控件创建HeaderTemplate 267
8.10.3 为ExpanderView控件创建ExpanderTemplate 268
8.10.4 为ExpanderView控件创建ItemTemplate 268
8.11 为笔记搜索结果创建数据模板 270
8.11.1 为ListBox控件创建ItemTemplate 270
8.11.2 为ExpanderView控件创建ExpanderTemplate 270
8.11.3 为ExpanderView控件创建ItemTemplate 271
8.12 测试应用 272
8.13 改善用户体验 275
8.14 经验分享与思考 276
第9章 数据同步——后台文件传输 277
9.1 创建一个简单的HTTP文件上传服务 277
9.2 创建数据同步页面 280
9.2.1 创建页面 280
9.2.2 布局内容 281
9.3 创建同步视图模型 281
9.4 理想的首次同步过程 285
9.4.1 首次打开同步页面 285
9.4.2 单击“同步”按钮 286
9.4.3 同步成功 288
9.5 准备首次同步 289
9.6 测试应用 291
9.7 允许停止同步 293
9.8 处理同步失败 294
9.9 打开同步页面时的状态 295
9.9.1 初始化同步取消状态 295
9.9.2 初始化正在同步状态 296
9.9.3 初始化同步成功和同步失败两种状态 297
9.10 测试应用 299
9.11 经验分享与思考 300
第10章 设置应用——多语言支持 302
10.1 创建设置页面 302
10.1.1 创建Pivot页面 302
10.1.2 语言设置 302
10.1.3 Tiles设置 303
10.1.4 学期设置 304
10.2 提供多语言支持 306
10.2.1 添加本地化资源文件 306
10.2.2 使用本地化资源文件 309
10.2.3 为Application Bar提供多语言支持 310
10.3 测试应用 311
10.4 设置显示语言 314
10.4.1 为本地化资源设立更改通知机制 315
10.4.2 触发本地化资源的更改通知机制 316
10.4.3 读取和保存显示语言的设置 317
10.5 测试应用 320
10.6 自动刷新主页上的Tiles 322
10.6.1 通过DispatcherTimer设立自动刷新机制 322
10.6.2 启用/禁用自动刷新 323
10.7 测试应用 325
10.8 启用/禁用今天课程Tile 327
10.8.1 固定/移除今天课程Tile 328
10.8.2 启用/禁用后台更新 330
10.9 测试应用 332
10.10 管理数据库文件的存档 339
10.11 测试应用 341
10.12 经验分享与思考 345
参考文献 346