一个高难度拼图游戏大全的游戏,有一个是用不上的

更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
按住视频可进行拖动
&正在加载...
{{ each data as item index}}
{{if item.isLast}}
&正在加载...
抱歉,本页暂无内容!
{{#payMarkUrl}}
{{/payMarkUrl}}
{{^payMarkUrl}}
{{/payMarkUrl}}
&正在加载...
{{ each data as item index}}
{{item.playcount}}
举报视频:
举报原因(必填):
请说明举报原因(300字以内):
请输入您的反馈
举报理由需要输入300字以内
感谢您的反馈~
请勿重复举报~
请刷新重试~
把视频贴到Blog或BBS
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
方式1:用手机看
用爱奇艺APP或微信扫一扫,在手机上继续观看
当前播放时间:
方式2:一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接//71.am/udn
下载安装包到本机:&&
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:&&
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
正在检测客户端...
您尚未安装客户端,正在为您下载...安装完成后点击按钮即可下载
30秒后自动关闭
: 第1集 拼图游戏0和1
请选择打赏金额:
播放量12.7万
播放量数据:快去看看谁在和你一起看视频吧~
更多数据:
{{each data}}
抱歉,没有“{{feature}}”的其他视频了.
&正在加载...
&正在加载...
&正在加载...
&正在加载...
&正在加载...
&正在加载...
{{ each data as item index}}
Copyright (C) 2018
All Rights Reserved
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
正在为您下载爱奇艺客户端安装后即可快速下载海量视频
正在为您下载爱奇艺客户端安装后即可免费观看1080P视频
&li data-elem="tabtitle" data-seq="{{seq}}"&
&a href="javascript:void(0);"&
&span>{{start}}-{{end}}&/span&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"&
&a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《》剧集:
后才可以领取积分哦~
{{if data.viewCount && data.viewCount != "0" && data.viewCount != "1" && data.viewCount != "2"
访问泡泡首页
+{{data.rewardScore}}分
{{if data.rewardCount && data.rewardCount != 0 && data.getRewardDayCount != 0}}1{{else}}0{{/if}}/1
{{if data.rewardCount && data.rewardCount != 0 && data.getRewardDayCount != 0}}
+{{data.signScore}}分
{{data.signCount}}/1
{{if data.signCount && data.signCount != 0}}
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制找一个拼图游戏_steam吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:1,687,356贴子:
找一个拼图游戏
找个拼图游戏,风格有点像欧美教堂窗子上的画。主题是国家,每个国家一副拼图。之前看散人玩过,后来想来救特别想玩,然而忘了名字
Steam游戏专享加速线路,支持游戏一键加速,解决延迟卡顿,掉线频繁,登录不上等问题.国际节点,智能加速.24小时免费试用.加速用海豚,游戏更顺畅!海豚为您的游戏保驾护航.
不懂帮顶 看看楼下大佬有何高见
自顶,那个游戏画风挺漂亮的,在steam上不知道是不是搜的姿势不对,怎么都找不到
Glass Masquerade我之前看过 但是这种花玻璃风格肯定是直接搜glass就有了
贴吧热议榜
使用签名档&&
保存至快速回贴记录学习工作中的点滴,自己备忘也方便他人。
一个拼图游戏,包含很多内容。
Hands-On Lab
构建您第一个 Windows Phone 7 应用程序
实验版本号:
本实验手册向您介绍为Windows Phone应用程序构建和测试一个Silverlight所需要的工具和过程。实验手册通过一个简单的益智游戏开发的全过程以及其不同阶段:开始一个新的项目、添加控件、代码隐藏、测试和调试,来向您展示开发Windows Phone应用程序的基本原则。
这个实验涵盖了Windows Phone平台几个关键的特性,包括:导航功能,多点触摸和独立存储。
这个实验的对象是那些对Microsoft工具,例如Visual Studio了解较少,且对Silverlight非常陌生的开发人员。如果您对Silverlight的编程模型感到很适应,且已经开始利用Visual Studio和Microsoft Expression套件进行工作,那么您可以考虑略过本实验。从另一方面讲,如果您完全对Silverlight不了解,我们强烈建议您查阅一些与Silverlight相关的实验来丰富您的Silverlight技能 ,这些实验的内容可以从下面这个站点找到:。
在这个实验手册中,您将会学到:
Windows Phone 开发人员使用的工具更加熟悉:针对Windows Phone的Microsoft Visual Studio2010 Express
版本和Windows Phone Emulator。这些就是您创建和测试任何可被管理的Windows Phone应用程序所需要的工具。
学习针对Windows Phone应用程序的Silverlight的基础结构,同时学到Silverlight和针对Windows Phone的Silverlight之间的不同
利用针对 Windows Phone的Microsoft Visual Studio 2010 Express和WindowsPhone Emulator编写、测试、部署和调试Windows Phone应用程序的。
要完成本动手实验,您需要以下工具:
用于Windows Phone的MicrosoftVisual Studio 2010 Express或者是Microsoft Visual Studio 2010WindowsPhone Developer Tools
Windows Phone开发者工具
注释:您可从该网址下载工具
为了方便,本实验手册中的大部分代码以Visual Studio代码段的形式提供。要安装代码段:
在lab's下的 Source\Setup文件夹,执行.vsi 安装程序。
注释: 如果你在执行代码片段的安装程序时遇到问题,你可以通过拷贝Source\Setup\CodeSnippets文件夹下的所有.snippet文件到目录:
\My Documents\Visual Studio 2010\Code Snippets\Visual C#\My CodeSnippets来进行手动安装代码段
使用代码段
利用这些代码段,您实际上已经获得了编程操作所会用到的所有代码。这个实验文档将会准确的告诉您何时使用这些代码。例如
使用Visual Studio代码段把代码插入到你的工程里
为了把代码段添加到VisualStudio中,你只要把光标放在你想插入的代码上.开始输入段的名字(没有空格和连字号),看到IntelliSense显示的段名,然后当你想要的段名被选中时,敲击Tab键两次,代码将会被插入到光标的位置。
开始输入段名
敲击Tab键来选中高亮的段
再次敲击Tab键来展开段
使用鼠标而不是键盘来插入代码段:在你想插入代码段的地方点右键,选择My Code Snippets下的 InsertSnippet,然后从列表中挑选相关的代码段。
想学习更多的Visual Studio代码段,包括如何创建自己的代码段,请参考.
本实验手册包含以下练习:
利用Microsoft Visual Studio 2010 Express为Windows Phone创建Windows Phone应用程序
在Visual Studio中创建拼图板
利用独立存储来保持游戏状态
完成此实验需耗时: 60分钟。
练习 1: 利用Microsoft Visual Studio 2010 Express为Windows Phone创建Windows Phone应用程序
在这个练习中,您将 学会如何创建、测试、部署和运行您的第一个Windows Phone应用程序。您将会学会如何使用Windows Phone开发者工具,包括:用于Windows Phone IDE的免费工具Microsoft Visual Studio 2010Express和Windows Phone Emulator。
任务包括为Windows Phone工程创建一个新的Silverlight,设计应用程序的起始页面,提供一些基础的容错处理。您同样将会把应用程序运行在工作站的Windows Phone Emulator上。
注释:本次动手实验的步骤阐明了Windows Phone上Microsoft Visual Studio 2010Express的使用过程,但是它们同样适用于带Windows Phone开发工具的Microsoft Visual Studio 2010。通常,操作指南里提到的Visual Studio,对这两个产品都适用。
在Visual Studio中创建一个Windows Phone 应用程序工程
这个任务中,您将会利用针对Windows Phone的MicrosoftVisual Studio 2010 Express 工具内嵌的模板来创建一个Windows
Phone应用程序工程的Silverlight,可以把这做为您第一个要开发的Window Phone应用程序的起点。
从操作系统的Start | All Programs | Microsoft Visual Studio 2010 Express |Microsoft Visual Studio 2010 Express for Windows Phone中启动用于Windows Phone应用程序开发的MicrosoftVisual Studio 2010 Express 。
Visual Studio 2010: 从操作系统的Start | All Programs |Microsoft Visual Studio 2010启动Visual Studio 2010。
菜单,选择New Project。
Visual Studio 2010: 在 File菜单, 指向 New 然后选择Project。
在 New Project对话框,从安装的模板列表里选择Silverlight for Windows Phone类别,然后选择 Windows Phone 应用程序模板。把name栏改为Windows Phone Puzzle ,同时把location 设为在实验目录下
Source 文件夹中的Ex1-CreatingWP7Apps。更改 solution name 为Begin,然后点击OK。
在用于Windows Phone的MicrosoftVisual Studio2010 Express中创建一个新的Windows Phone应用程序
注释:如果您已经完成培训教材中Hello Pone的实验,您可能已经对下面的材料非常熟悉,可能会直接创建一个begin解决方案执行这个练习中任务3的操作。
在 Solution Explorer中,查看基于Windows Phone 应用程序模板产生的解决方案的结构。Visual Studio解决方案是该解决方案下所有工程项目的容器;本例中的解决方案只包含了一个名为Windows Phone Puzzle的Silverlight Windows Phone工程项目.
SolutionExplorer 包含一个名为Windows Phone Puzzle的应用程序
注释: Solution Explorer允许用户在解决方案或工程项目中查看其包含的项(Item)以及对项进行管理操作。要启动 Solution Explorer,在键盘上按下
CTRL + W, S 或者在 View 菜单,选择 Other Windows | Solution Explorer。
Windows Phone Puzzle项目包含以下项 (Item):
App.xaml / App.xaml.cs
定义应用程序的入口点,初始化应用程序范围内的资源,,显示应用程序用户界面
MainPage.xaml / MainPage.xaml.cs
定义应用程序中的程序页面(带有用户界面的页面)
ApplicationIcon.png
一种带有图标的图像文件,代表了手机应用程序列表中应用程序的图标
Background.png
一种带有图标的图像文件,代表了在开始页面上应用程序的图表
SplashScreenImage.jpg
这个图片会在应用程序第一次被启动时显示。启动画面会给用户一个即时的反馈,告诉用户应用程序正在启动直到成功跳转到应用程序的第一个页面。用户的启动画面可以和应用程序的一个页面设计的非常相似,这样能给使用这一个应用程序被快速加载的感觉。
Properties\AppManifest.xml
一个生成应用程序包所必需的应用程序清单文件
Properties\AssemblyInfo.cs
包含名称和版本的元数据,这些元数据将被嵌入到生成的程序集
Properties\WMAppManifest.xml
一个包含与Windows
Phone Silverlight应用程序相关的特定元数据的清单文件,且包含了用于Windows Phone的Silverlight所具有的特定功能
References folder
一些库文件(集)的列表,为应用程序的工作提供功能和服务。
首先,在Solution Explorer中右键单击App.xaml 并选择View Designer。注意这个文件的XAML标记,它有一个叫
Application 的根元素,在这个根元素中有一个叫Application.Resources的段。 此处,您可以定义应用程序级别的资源,例如整个应用程序使用的颜色、画笔以及样式对象。
这段XAML代码初始化了Application的ApplicationLifetimeObjects属性,创建了一个PhoneApplicationService 对象。PhoneApplicationService 类提供了应用程序不同生命阶段的访问功能。包含了对应用程序处于空闲状态的管理,也包含了当应用程序处于有效或无效状态时的管理。
基于Windows Phone应用程序模板产生的缺省App.xaml文件
注释: App.xaml 文件,连同其代码隐藏文件App.xaml.cs,共同定义了Application 类的实例。这个类封装了用于WindowsPhone的Silverlight,并提供了一个入口点。
现在, 在Solution Explorer 中右键单击 App.xaml 并选择
View Code 来打开一个代码隐藏文件。请注意,在Application的派生类的构造函数中已经有一个针对UnhandledException事件的句柄。在后面的实验中,您将会更新模板生成的句柄来实现跳转到一个错误页面及显示错误信息的功能。
Application 类的RootFrame 属性标识了应用程序的启动页面。 所有的Windows Phone应用程序都有一个最顶层的容器元素,它的数据类型是PhoneApplicationFrame 。这个框架承载了一个或多个用来标识应用程序内容的PhoneApplicationPage 元素,同时它还被用来处理不同页面之间的导航切换。
应用程序的代码隐藏文件展示了全局事件句柄
注释: 以Windows Phone应用程序模板为基础的Silverlight所生成Application类,除了对上述事件的句柄外,还包含了对Launching
和Closing事件的句柄。您可以通过更新这些方法的代码来实现当Windows Phone应用程序启动和关闭过程中执行自己定制过的代码。
新生成的工程项目包含一个缺省的文件,该文件里包含了用来定义应用程序主用户界面的XAML标记。用户如果要在designer中查看这个文件,则需在Solution Explorer中右键单击MainPage.xaml。
默认状态下,designer 会把这个文件用分隔视图显示。一个窗口显示XAML标记,另一个 窗口显示了所见即所得的用户界面元素设计视图。模板中显示的是应用程序的名称和标题,您可以根据需要删除它们。除此之外,XAML文件还可提供给您一个空白的类似画布的操作区域,您可以通过添加控件来创建自己的应用程序的用户界面。
XAML 设计工具(designer)展示了应用程序的主用户界面
注释: 可扩展的应用程序标记语言 (XAML) 是一种声明性语言。您可以利用声明XAML标记来创建可见的用户界面元素。然后再利用一个代码隐藏文件对XAML中声明的事件做出反应,并操作在XAML中已经声明的对象。用一种基于XAML的声明性语言来创建接口,从原型到生产整个过程都是非常直观的,特别是对那些有网页设计和技术背景的人来说更是如此。
ApplicationIcon.png 文件包含的图标文件,就是那些在电话设备上快速启动页面中代表应用程序的图标。您可以在Solution Explorer 上右键单击该项,用在你机器上注册的图像编辑应用程序来打开它,例如,
Paint.exe。
注释: Visual Studio 2010中, 在Solution Explorer 上右键单击图标文件,该文件会在内嵌的图像编辑器中打开。
一个Windows Phone应用程序通常需要用到基础平台或者其他类库来提供服务。要先使用这个优势功能,应用程序需要首先引用实现这些服务的程序集。要显示一个项目工程引用的程序集, 在Solution Explorer中展开References节点,然后查看程序集列表。它包含了Silverlight一般的程序集以及具体到Windows Phone平台的程序集。
SolutionExplorer 展示了 被项目工程引用的程序集合
项目工程的Properties视窗是编辑WP清单文件的唯一方式,正如下表所示。想打开这个窗口,在Solution Explorer中 右键单击Windows Phone Puzzle 项目然后选择
Properties。
项目属性窗口
注释: Windows Phone 项目属性窗口允许您更改一些电话程序专用的属性。这些属性关系到应用程序在电话设备上的部署和外观效果。所有相关参数被存储在WMAppManifest.xml 文件中。即使您试图手动更改过这个XML文件,只要在这个对话框中对您的项目进行更改设置并保存,其结果都会自动覆盖您之前的手动更改。
在WindowsPhone Emulator中构建并测试应用程序
此时,应用程序并不能做什么,但是它已经做好第一次测试运行的准备。在这个任务中,您会构建一个应用程序,并把它部署到Windows Phone Emulator然后执行它,通过这些您就能了解一个典型的开发过程。
在 Debug 菜单,指向 Windows 然后通过选择
Output 来打开 Output 窗口。
在Debug菜单选择Build Solution 或者按键盘上的SHIFT + F6 组合键来编译解决方案中的项目工程。
Visual Studio 2010: 在Debug菜单选择Build Solution
或者按键盘上的CTRL + SHIFT + B组合键来编译解决方案中的项目工程。
查看 Output 窗口查看构建编译过程中产生的每条消息记录,包括最后输出的结果信息。
在Visual Studio中构建(Build)应用程序
眼下您应该不会发现任何错误,但是如果项目包含编译错误,那么这些错误信息将会出现在Output窗口中。要处理这些类型的错误,您可以利用Error List 视窗。这个视窗能够以列表的形式显示错误、警告以及编译器产生的信息,您可以根据错误的严重性来排序或者过滤。此外,你可以通过双击列表中的条目来自动打开相关源代码文件并切换到错误的源点。要打开Error List视窗,在View菜单,指向Other
Windows然后选择Error List。
Visual Studio 2010: 点击View 菜单,选择Error List 来打开Error List视窗。
ErrorList 视窗显示构建过程中的错误
验证部署的目标是Windows Phone Emulator要做到这样,确保在工具栏上Start Debugging按钮旁的Select Target下拉框中的值是Windows Phone 7 Emulator。
选择目标设备来部署应用程序
注释: 当您从Visual Studio中部署您开发的应用程序时,您既可以选择一个真实的设备或者是. WindowsPhone Emulator。
在Windows Phone Emulator上按F5 来启动应用程序。注意设备模拟器窗口的出现,同时在Visual Studio建立模拟器环境和部署应用程序镜像时会出现一个停顿。
部署一个应用程序镜像到 Windows Phone Emulator
一旦准备就绪, 模拟器会显示开始页面,不久之后,您的应用程序也将会出现在模拟器的窗口中。
在 Windows Phone Emulator中运行应用程序
直到您完成了创建用户界面以及应用程序逻辑的编程设计,否则您在当前应用程序的页面基本上什么都不能做。按下SHIFT + F5或者工具栏上的Stop按钮来分离调试器并终止调试会话。不要关闭模拟器视窗。
终止调试会话
提示:当您启动一个调试会话时,它将会花费一些时间来搭建模拟器环境以及启动应用程序。为使您的调试过程简单而有效,当您在用Visual Studio编写源代码的时候,请避免关闭模拟器。如果模拟器一直处于运行状态,它只会用很少的时间来完成停止当前会话、编辑源代码、构建应用程序、部署新应用程序镜像、重新启动调试会话这一整个过程。
3 – 为主页设计用户界面
在这个任务中您将会为应用程序的主页面创建用户界面。这个页面显示一个版权页。它包含一个代表应用程序的图片以及离开版权页导航进入到游戏页面的按钮。
首先,在工程里新建一个文件夹来保存应用程序中所使用的图片。在 Solution Explorer窗口中,右键单击
WindowsPhonePuzzle 工程节点, 指向 Add 并选择 New Folder。为创建好的文件夹命名为
注释:当您添加了一个新的文件夹,Solution Explorer窗口中将会显示一个以占位符命名的文件夹,您可以通过输入一个新的名称来替换占位符。如果您意外的放弃编辑模式,您可以按F2重新回到编辑模式。
SolutionExplorer窗口展示了新 Assets文件夹
现在,向工程中添加应用程序所需的图片。在 Solution Explorer窗口上,右键点击
Assets,选中Add 然后选择Existing Item。在
Add Existing Item 对话框, 点击browse并定位到实验目录下Source文件夹中的Assets ,然后按住CTRL键不放 ,鼠标点击SplashImage.jpg 和Puzzle.jpg ,选中这两个文件后点击
注释:在 Visual Studio中,您可以为自己在Windows Phone工程中创建的Silverlight添加资源文件,然后可以通过设置Build Action的值来完成对这些文件的部署。项目工程中每个被添加的图片Build Action值都要被设为Resource,这些图片在进行工程汇编时会被嵌入文件中。
试图查看某个图片,您可以在Solution Explorer 上右键单击该项,用在你机器上注册的图像编辑应用程序来打开它,例如Paint.exe。
注释: Visual Studio 2010中, 在Solution Explorer 上右键单击图标文件,该文件会在内嵌的图像编辑器中打开
应用程序包中的图像嵌入资源
打开应用程序的主页面,在Solution Explorer窗口,右键单击MainPage.xaml将其加载到designer中。
在 Design 视图,选择 TextBlock并将其命名为ApplicationTitle 然后按
F4。在 Properties 窗口,更改 Text 属性——将所有属性按照类排序后,其位置在Common分类中——为其添加值 ‘WINDOWS PHONE PUZZLE’。
在Properties窗口配置UI 元素
注释:您可以通过点击Properties窗口工具条上的图标来为所有属性进行按照类别或者属性排序。
接下来, 选择名为PageTitle的 TextBlock 并替换其 Text属性值为‘start’。
在由Windows Phone应用模板产生的XAML标记程序中,定位名为LayoutRoot的Grid容器元素。它是用来布置页面上的元素。注意 root Grid 元素包含其他嵌入的元素, 这些元素通过定义一个 Grid.Row 属性被分配到外部Grid里的不同行。找到名为ContentPanel的Grid元素并将其Grid.Row设为1,并插入下面高亮的XAML标记代码。
&Grid x:Name="LayoutRoot" Background="Transparent"&
&!--ContentPanel - place additionalcontent here--&
&Grid x:Name="ContentPanel" Grid.Row="1"Margin="12,0,12,0"&
&Grid.RowDefinitions&
&RowDefinition Height=".8*" /&
&RowDefinition Height=".2*" /&
&/Grid.RowDefinitions&
&Image Source="Assets/SplashImage.jpg"VerticalAlignment="Center"HorizontalAlignment="Center"Width="471"Height="492"
&Button Content="START!"Name="StartButton"Grid.Row="1"VerticalAlignment="Center"HorizontalAlignment="Center" /&
注释:上面的XAML标记代码创建了一个两行的页面布局,第一行包含了版权页所需的图片,第二行包含了一个用来退出当前页面并导航切换到智力游戏主页面的按钮。
切换编辑模式到Design视图。要把Design视图最大化到视图区域,双击设计工具视窗右边缘上Design 标签( ) 。如果您不方便找到正确的标签,可以把鼠标停留在每个标签上显示提示信息,从而找到正确的标签。
注释:如果您的实际工具视窗选择的是水平分隔视图,则标签将会被自动放置到视窗的下边缘。
START按钮 。这样做就创建了一个Click事件句柄并且会自动打开代码隐藏文件,此时光标会定位到StartButton_Click事件句柄的方法代码中。把以下(高亮)代码段粘贴到方法代码中。
(代码段 – YourFirstWP7App – 练习1 任务 3 步骤 9 – StartButton_Click 事件句柄)
private voidStartButton_Click(object sender, RoutedEventArgs e)
// navigate
this.NavigationService.Navigate(new Uri("/PuzzlePage.xaml", UriKind.Relative));
注释: PhoneApplicationPage 类通过它的NavigationService属性提供了切换到其他页面的方法和属性。您可以调用NavigationService 的Navigate 方法并把页面的URL做为传参。您还可以使用GoBack 和
GoForward方法在导航历史中向前或向后导航 。硬件设备的后退按键通过应用程序也提供了向后翻页导航的功能。
上面的事件句柄显示了使用NavigationService跳转到PuzzlePage.xaml页面。
4 – 在应用程序中处理错误
在这个任务中,您将会通过升级应用程序来显示异常不能被处理的错误页面。要管理不能被处理的异常操作,您首先需要在应用程序中增加一个新的页面来显示错误的信息。然后,您需要创建一个事件句柄来处理UnhandledException事件。无论何时当应用程序不能捕捉一个异常的时候,都将触发该事件在句柄程序中,您导航切换到一个错误页面并将异常的错误信息传递给该页面。
注释: 不去考虑如何实现一个未处理异常的句柄,您的应用程序应该包含您所能处理的任何异常的操作。
首先,添加一个新的页面到项目工程中。 在 Solution Explorer视图,右键单击Windows Phone Puzzle 工程节点, 指向
Add并选择 New Item. 在 Add New Item 对话框, 从模板列表里选择Windows Phone PortraitPage ,把name 设为
ErrorPage.xaml 然后点击 Add。
为工程添加一个新的页面
在ErrorPage.xaml 文件中,找到名为LayoutRoot的Grid元素,并用下面的蓝色高亮XAML标记代码替换它的子控件。这个XAML定义了一个应用程序标题和页面标题,两个标题都被命名为error。它同样定义了一个TextBlock对象并被指定为x:Name="ErrorText"样式,用来保存任何未来异常的错误文本。
&Grid x:Name="LayoutRoot"Background="Transparent"&
&Grid.RowDefinitions&
&RowDefinition Height="Auto"/&
&RowDefinition Height="*"/&
&/Grid.RowDefinitions&
&!--TitlePanel contains the name of the applicationand page title--&
&StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="24,24,0,12"&
&TextBlock x:Name="ApplicationTitle" Text="WINDOWS PHONE PUZZLE" Style="{StaticResource PhoneTextNormalStyle}"/&
&TextBlock x:Name="PageTitle" Text="error" Margin="-3,-8,0,0" Style="{StaticResource PhoneTextTitle1Style}"/&
&/StackPanel&
&!--ContentPanel - place additional contenthere--&
&Grid x:Name="ContentPanel" Grid.Row="1"&
&Border BorderBrush="White"&
&TextBlock x:Name="ErrorText" Style="{StaticResource PhoneTextSmallStyle}" TextWrapping="Wrap" /&
现在,按下F7来打开一个新页面的代码隐藏文件。或者,作为另一种选择,在Solution Explorer 视窗上右键单击ErrorPage.xaml然后选择View Code。在文件的最上层插入下面的命名空间。
using System.Windows.N
然后,把下面代码段中高亮的部分插入到ErrorPag类中。这样做就建立了一个Exception对象,当跳转切换到这个页面的时候会自动挂接到ErrorText.Text。
(代码段 – YourFirstWP7App –练习 1 任务 4 步骤 4 – 错误页面 OnNavigatedTo)
public partial class ErrorPage : PhoneApplicationPage
publicErrorPage()
InitializeComponent();
public static ExceptionE
// Executes whenthe user navigates to this page.
protected override voidOnNavigatedTo(NavigationEventArgs e)
ErrorText.Text = Exception.ToString();
当这个页面完成后,无论何时,当一个不能被处理的异常出现,此类事件的句柄会使程序切换到错误的页面,并显示错误的信息。在Solution Explorer视图上,右键单击App.xaml并选择View Code来打开Application类的代码隐藏类。
类中,找到 Application_UnhandledException 事件句柄并用下面的代码(高亮部分)替换句柄方法的程序体。
(代码段 – YourFirstWP7App –练习 1 任务 4 步骤6 –Application_UnhandledException)
//Code to execute on Unhandled Exceptions
private voidApplication_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
if(System.Diagnostics.Debugger.IsAttached)
// An unhandled e break in the debugger
System.Diagnostics.Debugger.Break();
e.Handled =
ErrorPage.Exception= e.ExceptionO
(RootVisual asMicrosoft.Phone.Controls.PhoneApplicationFrame).Source=
new Uri("/ErrorPage.xaml", UriKind.Relative);
注释:这个Application_UnhandledException 就像一张安全网,您应用程序中所有的不能被处理的异常都在这里终止。UnhandledException事件句柄处理完成后,它把所有的Handled属性都设置为true,这样做是为了阻止对异常的进一步处理。然后它把未处理异常的信息保存到ErrorPage类的静态成员中,并设置帧的Source属性来显示错误页面。当您设置Source属性的值与显示内容不同时,那么显示帧将会切换到一个新的内容。当您导航切换到错误的页面后,它将会返回异常对象的文本值(Exception.ToString())
并以此显示到页面中。一旦您开始在真正设备上调试您的应用程序,这将会非常有用。
在这个任务中,你开始构建这个应用程序,并将其部署到WindowsPhone Emulator,执行该应用成来验证你之前的操作是否正确。
在Visual Studio中,按 CTRL + F5 把应用程序部署到WindowsPhone Emulator 并运行它(不是调试)。等待应用程序启动并显示其主页面。它将会显示版权页。
运行在模拟上的应用程序的版权页
点击START按钮。注意应用程序显示了您之前定义的不能处理异常的错误页面。请记住这是所期望得到的结果,因为按钮点击事件的句柄是将会切换屏幕到PuzzlePage.xaml页面,这是一个当前还没有定义的页面。您将会在后面的实验中定义该页面。
未处理异常错误页面
双击 Back 按钮回到电话的主页面。到目前位置,除非为应用程序增加新的功能,否则您所能做的非常有限。请不要关闭模拟器窗口。
练习2: 在Visual Studio中创建拼图板
在这个任务中,您将会创建一个页面来显示拼图板和玩游戏。这个页面显示了一个图片,当点击它是,图片会碎成多片同时会在拼图板中随机排列。
这个游戏的逻辑已经包含在了PuzzleGame类中,您可以使用实验提供的资源包添加这个类到项目工程中。在这个练习中,您会创建页面上控件的布局,添加必需的应用程序逻辑来初始化拼图板以及响应用户界面上的事件。 接下来,您需要添加多点触摸功能来支持用户使用手指来拖拽拼图板上每一片拼图并重新排列它们。最后,您将使用动画脚本来创建完成拼图时的引人注目的视觉效果。
创建用户界面
在这个任务中, 您会为应用程序添加一个新的页面来显示拼图板,还会添加必需的用户界面元素来显示拼图的图片以及游戏过程中已经移动拼图次数的状态面板。在页面中,还会有一个按钮,当按下,它将会帮助您解密完成拼图。
如果还没有打开,从Start | All Programs | Microsoft Visual Studio 2010Express for Windows Phone启动用于 Windows Phone的Microsoft Visual Studio 2010 Express。
Visual Studio 2010: 从操作系统的Start | All Programs |Microsoft Visual Studio 2010启动Visual Studio 2010。
如果您完成了前一个练习的所有步骤,您可以继续继续使用为上个练习所创建的解决方案(solution);否则,从实验的Source文件夹下的Hello Phone\Ex2-WP7AppUXDesignWithBlend\Begin处打开Begin. sln。
为工程添加一个新的页面。在Solution Explorer视图上, 右键单击 WindowsPhonePuzzle 工程节点, 指向
Add并选择New Item。在 Add New Item 对话框,从模板列表中选择
Windows PhonePortrait 页面,把 name 设置为 PuzzlePage.xaml 然后点击
为工程添加一个新的页面
In the XAML view of the newpage在新页面的XAML视图中,找到LayoutRoot 元素的RowDefinitions 部分,将其第一行Height属性的值 设为
配置Grid容器的页面设置
注释: 指定高度的值为*,是为了确保当Grid的布局中其行都已经被分配后,该行能够自动伸缩来填满可用空间。当高度为星(*)且包含一个乘数时,如在这个例子中第一行高度的定义,未被使用的空间基于乘数值被按比例分配给所有被标注为“start-sized”的行—乘数是1则假设为不指定。这样,在上面的定义中,第一行占有1/6的剩余空间。
在名为LayoutRoot的 grid中,删除缺省模板中存在的TitlePanel 和 ContentPanel元素—包括它的子元素部分。
在仅挨RowDefinitions 部分的下方,插入 两个StackPanel 容器元素,如下面高亮的部分,每个元素对应布局中的一行。
&Grid x:Name="LayoutRoot" Background="Transparent"&
&Grid.RowDefinitions&
&RowDefinition Height="0.2*"/&
&RowDefinition Height="*"/&
&/Grid.RowDefinitions&
&StackPanel Orientation="Vertical"VerticalAlignment="Stretch"&
&/StackPanel&
&StackPanel Orientation="Vertical"VerticalAlignment="Top"Grid.Row="1"&
&/StackPanel&
插入第一个 StackPanel 元素—被默认指定给LayoutRoot Grid容器最高一行(第0行) ssigned by default to the top row (row 0) of the
LayoutRoot grid—插入以下高亮部分的XAML markup代码。
&Grid x:Name="LayoutRoot" Background="Transparent"&
&StackPanel Orientation="Vertical" VerticalAlignment="Stretch"&
&Buttonx:Name="SolveButton"Content="SOLVE"Margin="10" HorizontalAlignment="Center" Click="SolveButton_Click"/&
&StackPanelx:Name="StatusPanel"Orientation="Horizontal"HorizontalAlignment="Center"Visibility="Collapsed"&
&TextBlockHorizontalAlignment="Center"Text="Your Moves: "TextWrapping="Wrap"Foreground="#FFD0D0D0"FontSize="17.333"/&
&TextBlockx:Name="TotalMovesTextBlock"HorizontalAlignment="Center"Text="N"TextWrapping="Wrap"Foreground="#FFFFB000"FontSize="17.333"/&
&/StackPanel&
&/StackPanel&
&StackPanel Orientation="Vertical" VerticalAlignment="Top" Grid.Row="1"&
&/StackPanel&
注释:这部分高亮XAML标记代码定义了一个按钮,当您按下时它将会自动解谜拼图并会在状态面板中显示完成游戏一共移动了多少步。
然后, 在Grid布局中最下面一行即第二个 StackPanel 元素中, 插入以下高亮 XAML markup代码。
&Grid x:Name="LayoutRoot" Background="Transparent"&
&StackPanel Orientation="Vertical" VerticalAlignment="Top" Grid.Row="1"&
&Border x:Name="CongratsBorder"Height="30"Background="#FFF10DA2"HorizontalAlignment="Center"Width="443"RenderTransformOrigin="0.5,0.5"UseLayoutRounding="False"Opacity="0"&
&Border.RenderTransform&
&TransformGroup&
&ScaleTransform/&
&SkewTransform/&
&RotateTransform/&
&TranslateTransform/&
&/TransformGroup&
&/Border.RenderTransform&
&TextBlock HorizontalAlignment="Center"Text="CONGRATULATIONS!"TextWrapping="Wrap"Foreground="White"FontSize="17.333"VerticalAlignment="Center"FontWeight="Bold"/&
&/StackPanel&
注释:这个Border元素中包含了当拼图完成时将会被显示的一个消息。注意Border 中包含了RenderTransform。这个形变是后面实验中创建动画脚本时所需要的,目的是为了提供一个视觉效果。动画脚本不能使一个元素动起来,除非它发生了形变。
为了下面那个StackPanel元素的内容, 接着上一步插入的代码后面再次插入下面的高亮XAML代码。
&Grid x:Name="LayoutRoot" Background="Transparent"&
&StackPanel Orientation="Vertical" VerticalAlignment="Top" Grid.Row="1"&
&Border x:Name="CongratsBorder"...&
&Border x:Name="border"BorderThickness="3"Background="#FF262626"HorizontalAlignment="Center"VerticalAlignment="Center"Padding="1"RenderTransformOrigin="0.5,0.5"&
&Border.RenderTransform&
&TransformGroup&
&ScaleTransform/&
&SkewTransform/&
&RotateTransform/&
&TranslateTransform/&
&/TransformGroup&
&/Border.RenderTransform&
&Border.BorderBrush&
&LinearGradientBrush EndPoint="0.5,1"StartPoint="0.5,0"&
&GradientStop Color="#FFF10DA2"Offset="0"/&
&GradientStop Color="#FFEE7923"Offset="1"/&
&/LinearGradientBrush&
&/Border.BorderBrush&
&Canvas Height="435"Width="435"&
&Image x:Name="PreviewImage"Height="435"Width="435"Opacity="0.2" /&
&Canvas x:Name="GameContainer"Width="435"Height="435" /&
&TextBlock x:Name="TapToContinueTextBlock"HorizontalAlignment="Center"Text="Tap the picture to start thepuzzle" TextWrapping="Wrap"Foreground="#FFD0D0D0"FontSize="17.333"/&
&/StackPanel&
注释: 上面的XAML标记定义了一个Border元素,实现用带有多种颜色的渐变线性画刷来画图,且这些颜色彼此融入。这个元素还指定了一个RenderTransform,目的是为了创建动画脚本来实现视觉效果。
Border元素中有一个单独的Canvas 元素。这个容器元素被用来明确其它子元素相对在该容器元素中的坐标位置它的子元素中包含有一个Image元素,用一水印图片来预览拼图解决方案(PreviewImage)。还包含了一个内部的Canvas(GameContainer),用来保存拼图片。
标记中还包含了一个TextBlock 元素 (TapToContinueTextBlock) 显示了如何启动一个游戏。当游戏进行时,该元素就会被隐藏。
切换到设计来检查页面的布局。要选择视图并切换到最大可视区域,双击设计工具(designer)窗口的右边缘上的Design标签( )。如果您不能确定正确的标签,利用鼠标光标停留到每个表上会显示提示信息的办法来找到正确的标签。页面应该出现并显示成如下图:
WindowsPhone Puzzle 应用程序用户界面
2 – 编程实现应用程序逻辑
在这个任务中,您将会编程实现应用程序逻辑。包括初始化拼图板,从应用程序资源中读取图片和为用户界面上的事件创建句柄
向项目工程中添加包含游戏逻辑的类。在Solution Explorer上,右键点击Windows Phone Puzzle 工程节点,指向
Add 并选择 Existing Item. 在 Add Existing Item 对话框, 点击browse定位到实验下Source文件夹中的Assets, 选择
PuzzleGame.cs 然后单击 Add。
SolutionExplorer 显示已经添加的工程文件
注释:游戏的逻辑是被包含在PuzzleGame类中,您可以从实验中的资源包中找到该类并添加到工程中。这个类提供了一些方法,包括开一个新游戏,移动拼图片,保存和返回游戏状态。您可以自由的查看整个类中的源代码,但是详细地分析代码已经超出了本实验的范围。
打开你在前面任务创建的拼图页面的代码隐藏文件。要实现这一目的,在Solution Explorer上,右键单击PuzzlePage.xaml
文件,并选择View Code 。
把以下命名空间的声明添加到PuzzlePage.xaml.cs 代码隐藏文件中。
(代码段 – YourFirstWP7App – 练习 2 任务 2 步骤 3 – PuzzlePage 命名空间)
using System.IO;
using System.Windows.Media.I
using System.Windows.R
在PuzzlePage 类,插入下面成员变量的声明(高亮部分)。
(代码段 – YourFirstWP7App – 练习 2 任务 2 步骤 4 – PuzzlePage 成员变量)
public partial class PuzzlePage :PhoneApplicationPage
private const doubleDoubleTapSpeed = 500;
private const int ImageSize =435;
private PuzzleG
private Canvas[] puzzleP
private Stream imageS
publicPuzzlePage()
InitializeComponent();
现在, 添加一个 ImageStream 属性,如下面代码段所示(高亮部分)。
(代码段 – YourFirstWP7App – 练习 2 任务 2 步骤 5 – ImageStream 属性)
public partial class PuzzlePage :PhoneApplicationPage
public Stream ImageStream
return this.imageS
this.imageStream=
BitmapImagebitmap = new BitmapImage();
bitmap.SetSource(value);
this.PreviewImage.Source=
intpieceSize = ImageSize / this.game.ColsAndR
for (int ix = 0; ix & this.game.ColsAndRix++)
for (int iy = 0; iy & this.game.ColsAndRiy++)
ImagepieceImage = this.puzzlePieces[i].Children[0] as I
pieceImage.Source =
publicPuzzlePage()
InitializeComponent();
注释: ImageStream 属性返回拼图图片的使用流。它自动更新背景图片以及每个拼图碎片。您可以通过设置该属性值为任何一个有效的位图来实现替换拼图片,例如,一张来自手机相机所拍中的图片。在这个实验手册中,你可以使用应用程序包的内嵌资源。
利用下面代码段(高亮部分)更新PuzzlePage类的构造函数。
(代码段 – YourFirstWP7App – 练习2 任务 2 步骤 6 – PuzzlePage构造函数)
public partial class PuzzlePage :PhoneApplicationPage
publicPuzzlePage()
InitializeComponent();
SupportedOrientations = SupportedPageOrientation.Portrait | SupportedPageOrientation.L
// Puzzle Game
this.game =new PuzzleGame(3);
this.game.GameStarted+= delegate
this.StatusPanel.Visibility= Visibility.V
this.TapToContinueTextBlock.Opacity= 0;
this.TotalMovesTextBlock.Text= this.game.TotalMoves.ToString();
this.game.GameOver+= delegate
this.TapToContinueTextBlock.Opacity= 1;
this.StatusPanel.Visibility= Visibility.V
this.TotalMovesTextBlock.Text= this.game.TotalMoves.ToString();
this.game.PieceUpdated+= delegate(objectsender, PieceUpdatedEventArgs args)
intpieceSize = ImageSize / this.game.ColsAndR
this.AnimatePiece(this.puzzlePieces[args.PieceId], Canvas.LeftProperty, (int)args.NewPosition.X* pieceSize);
this.AnimatePiece(this.puzzlePieces[args.PieceId], Canvas.TopProperty, (int)args.NewPosition.Y* pieceSize);
this.TotalMovesTextBlock.Text= this.game.TotalMoves.ToString();
this.InitBoard();
注释:构造函数实例化游戏的逻辑—被PuzzleGame类封装—然后绑定其事件. The
PuzzleGame类定义了如下事件:
GameStarted:当游戏开始后这个事件就被触发。这个事件的句柄展示了带有图片被移动次数统计的面板,隐藏了如何开始游戏的说明并重置了已经移动拼图片的次数统计。
当拼图完成时这个事件就会发生。这个事件的句柄展示了如何运行游戏的图例说明,并更新了移动次数的统计。
PieceUpdated:无论何时当一个拼图片被移动,这个事件就会被触发。这个事件的句柄使评图片动起来并更新了移动次数的统计。
最后,通过预订一个事件句柄,构造函数调用InitBoard来初始化拼图游戏板。
接着, 在 PuzzlePage类, 定义 InitBoard 方法来初始化游戏板。
(代码段– YourFirstWP7App – 练习 2 任务 2 步骤 7 – InitBoard 方法)
private voidInitBoard()
int totalPieces = this.game.ColsAndRows* this.game.ColsAndR
int pieceSize = ImageSize / this.game.ColsAndR
this.puzzlePieces = newCanvas[totalPieces];
int nx = 0;
for (int ix = 0; ix& this.game.ColsAndR ix++)
for (int iy = 0; iy& this.game.ColsAndR iy++)
nx = (ix *this.game.ColsAndRows) +
Image image = new Image();
image.SetValue(FrameworkElement.NameProperty,"PuzzleImage_" + nx);
image.Height = ImageS
image.Width = ImageS
image.Stretch = Stretch.UniformToF
RectangleGeometry r = newRectangleGeometry();
r.Rect = new Rect((ix *pieceSize), (iy * pieceSize), pieceSize, pieceSize);
image.Clip=
image.SetValue(Canvas.TopProperty, Convert.ToDouble(iy * pieceSize * -1));
image.SetValue(Canvas.LeftProperty, Convert.ToDouble(ix * pieceSize * -1));
this.puzzlePieces[nx] = newCanvas();
this.puzzlePieces[nx].SetValue(FrameworkElement.NameProperty, "PuzzlePiece_" + nx);
this.puzzlePieces[nx].Width = pieceS
this.puzzlePieces[nx].Height = pieceS
this.puzzlePieces[nx].Children.Add(image);
this.puzzlePieces[nx].MouseLeftButtonDown += this.PuzzlePiece_MouseLeftButtonD
if (nx &totalPieces - 1)
this.GameContainer.Children.Add(this.puzzlePieces[nx]);
// Retrieve image
StreamResourceInfo imageResource = Application.GetResourceStream(new Uri("WindowsPhonePcomponent/Assets/Puzzle.jpg",UriKind.Relative));
this.ImageStream = imageResource.S
this.game.Reset();
注释: InitBoard方法创建了一个Canvas控件,该控件包含了拼图的所有的拼图片。每一片都是游戏中整幅图片的裁剪出的一部分。
这个方法从应用程序的资源中取得拼图游戏的图片并利用结果流初始化ImageStream属性。
插入AnimatePiece方法到PuzzlePage类中。
(代码段 – YourFirstWP7App – 练习 2 任务 2 步骤 8 – AnimatePiece 方法)
private voidAnimatePiece(DependencyObject piece, DependencyProperty dp, doublenewValue)
Storyboard storyBoard = newStoryboard();
Storyboard.SetTarget(storyBoard, piece);
Storyboard.SetTargetProperty(storyBoard, new PropertyPath(dp));
storyBoard.Children.Add(new DoubleAnimation
Duration= new Duration(TimeSpan.FromMilliseconds(200)),
From = Convert.ToInt32(piece.GetValue(dp)),
To = Convert.ToDouble(newValue),
EasingFunction = new SineEase()
storyBoard.Begin();
注释: AnimatePiece是一个句柄方法用来实现用户界面中拼图碎片的动画。它利用代码创建了一个动画脚本,并用该脚本更新控件中的任何一个DependencyProperty属性 。在这个应用程序中,此方法仅被用来更新拼图碎片的Top 和Left属性,并以此来控制碎片的位置。
为MouseLeftButtonDown事件增加一个句柄。为了实现这个目的,插入以下高亮代码到PuzzlePage类中。
(代码段 – YourFirstWP7App – 练习 2 任务 2 步骤 9 –PuzzlePiece_MouseLeftButtonDown 事件句柄)
private voidPuzzlePiece_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
if (!this.game.IsPlaying)
this.game.NewGame();
注释:当点击拼图板表面将会触发该事件的句柄,除非当前游戏还在运行,否则将会开启一个新的游戏。
现在,为“Solve”按钮添加Click事件的句柄。
(代码段– YourFirstWP7App – 练习2 任务 2 步骤 10 – SolveButton_Click 事件句柄)
private voidSolveButton_Click(object sender, RoutedEventArgs e)
this.game.Reset();
this.game.CheckWinner();
注释:按钮的事件句柄会强制游戏重置—显示完成拼图的原始图片——然后调用PuzzleGame类中的PuzzleGame.CheckWinner 方法。这个方法验证每张拼图碎片是否处于正确的位置并会触发GameOver事件,GameOver事件会使用户界面显示祝贺信息。
按F5 来构建并部署应用程序到WindowsPhone Emulator中,等待版权页面出现并点击START键。
开始一个新游戏
在模拟器窗口,点击图片来开始一个新的拼图游戏。 注意整张图片被分裂成图片碎片,这些碎片被随机分布在拼图板中。此外,观察图片碎片不是迅速被打乱到各个位置,而是由于使用AnimatePiece方法中调用的动画脚本,使得碎片缓慢平滑的进入到各个位置。这个方法实现对每个拼图碎片left和top坐标的移动,从而实现观察到的变化效果。
当游戏开始后拼图板上的拼图碎片被随机重新排列
选中一张碎片并尝试拖拽它。注意目前拖拽操作是无效的。在下一个任务中,您将会添加对multi-touch多点触摸的支持,并会允许您在拼图板中拖拽碎片来重新排列它们。
现在,点击SOLVE 按钮,此时可以看到拼图板上的碎片重新排列并显示原始的完成图片。
在Visual Studio中,按下SHIFT + F5停止调试进程。请不要关闭模拟器。
增加Multi-Touch支持
Multi-touch输入允许用户同时进行多指操作,这些操作被看成是一个单元来为应用程序和模拟提供复杂的操作命令,从而直接操控页面上的元素,例如,同时平移和缩放。 In this task在这个任务中,您会更新Windows Phone Puzzle游戏,使其能够接收multi-touch的输入并允许用户在拼图板上通过点击拼图碎片然后拖拽到空槽中。
在Solution Explorer中,在designer中通过右键点击PuzzlePage.xaml 选择
View Code 来打开该页面的代码隐藏文件。
在PuzzlePage 类中了,在已经存在的成员变量下插入下面的声明代码(高亮部分)。
(代码段 – YourFirstWP7App – 练习2 任务 3 步骤2 – Multi-Touch 成员变量)
public partial class PuzzlePage :PhoneApplicationPage
private const doubleDoubleTapSpeed = 500;
private const int ImageSize =435;
private PuzzleG
private Canvas[] puzzleP
private Stream imageS
private long lastTapT
private int movingPieceId = -1;
private int movingPieceD
private double movingPieceStartingP
publicPuzzlePage()
InitializeComponent();
现在,右键单击编辑窗口,选择View Designer ( ) ,切换到Design视图。
在designer表面上点击围绕模拟器的空白区域来选中PhoneApplicationPage元素并按下F4打开Properties窗口。在Properties视窗,点击Events标签来显示所有可用事件。
注释:请小心不要选择designer上另一个用户界面元素,否则将会显示错选元素的properties窗口。
在Microsoft Visual Studio 2010 Express中为Windows Phone 创建事件句柄
为ManipulationStarted事件定义一个事件句柄。为实现这个目的,在事件列表里双击相应的项订制该事件。当您这样操作时,Visual Studio会创建一个事件句柄并打开其代码隐藏文件中生成的方法体。把下面的代码(高亮部分)复制粘贴到PhoneApplicationPage_ManipulationStarted方法体内。
(代码段 – YourFirstWP7App – 练习2 任务 3 步骤 5 –PhoneApplicationPage_ManipulationStarted 事件句柄)
private voidPhoneApplicationPage_ManipulationStarted(objectsender, ManipulationStartedEventArgs e)
if (this.game.IsPlaying &&e.ManipulationContainer is Image && e.ManipulationContainer.GetValue(FrameworkElement.NameProperty).ToString().StartsWith("PuzzleImage_"))
int pieceIx= Convert.ToInt32(e.ManipulationContainer.GetValue(FrameworkElement.NameProperty).ToString().Substring(12));
Canvaspiece = this.FindName("PuzzlePiece_"+ pieceIx) as C
if (piece!= null)
inttotalPieces = this.game.ColsAndRows * this.game.ColsAndR
for (int i = 0; i & totalP i++)
if(piece == this.puzzlePieces[i] && this.game.CanMovePiece(i) & 0)
intdirection = this.game.CanMovePiece(i);
DependencyPropertyaxisProperty = (direction % 2 == 0) ? Canvas.LeftProperty: Canvas.TopP
this.movingPieceDirection=
this.movingPieceStartingPosition= Convert.ToDouble(piece.GetValue(axisProperty));
this.movingPieceId=
注释:当用户接触(或用鼠标点击)任何一个UIElement并操纵它时,会触发ManipulationStarted事件。这个事件的句柄会验证当前游戏是否正在运行,一个代表拼图碎片的图像元素是否触发了这个事件,否则句柄将会忽略此事件。该事件的句柄还会定位与拼图碎片对应的Canvas元素并调用游戏的逻辑来判断该碎片是否可以被移动—要做到这一点,拼图碎片旁必须有一个空槽。最后它会存储被选中的拼图碎片并记录碎片移动的坐标轴/方向。
接着,为ManipulationDelta事件创建句柄。再一次,右键点击代码编辑窗口,并选择View Desinger,切换到Design视图。然后,选择designer上的PhoneApplicationPage元素,按下F4打开其Properties窗口,选择Events标签。接着,在事件列表中找到ManipulationDelta事件,双击其对应的项来订制一个事件并由此产生了一个方法体。在代码隐藏文件中,插入以下代码(高亮部分)到PhoneApplicationPage_ManipulationDelta方法体中。
(代码段 – YourFirstWP7App – 练习 2 任务3 步骤 6 –PhoneApplicationPage_ManipulationDelta 事件句柄)
private voidPhoneApplicationPage_ManipulationDelta(objectsender, ManipulationDeltaEventArgs e)
if (this.movingPieceId & -1)
intpieceSize = ImageSize / this.game.ColsAndR
CanvasmovingPiece = this.puzzlePieces[this.movingPieceId];
// validatedirection
DependencyPropertyaxisP
doublenormalizedV
if (this.movingPieceDirection % 2 == 0)
axisProperty = Canvas.LeftP
normalizedValue =e.CumulativeManipulation.Translation.X;
axisProperty = Canvas.TopP
normalizedValue =e.CumulativeManipulation.Translation.Y;
// enforce dragconstraints
// (top or left)
if (this.movingPieceDirection == 1 || this.movingPieceDirection == 4)
if(normalizedValue & -pieceSize)
normalizedValue = -pieceS
else if (normalizedValue & 0)
normalizedValue = 0;
// (bottom orright)
else if (this.movingPieceDirection== 3 || this.movingPieceDirection == 2)
if(normalizedValue & pieceSize)
normalizedValue = pieceS
else if (normalizedValue & 0)
normalizedValue = 0;
// set position
movingPiece.SetValue(axisProperty,normalizedValue + this.movingPieceStartingPosition);
注释:当用户在手机触摸屏上移动其手指(或者鼠标点击)来操纵一个UIElement时,ManipulationDelta 事件就会被触发。这个事件的句柄会检查当前拼图碎片是否在被移动。如果是,它将会捕捉唯一可能移动的坐标轴/方向上的delta值。要做到这一点, 程序代码需要保证拖拽是有效的,即所有的移动操作需要在可用边界内进行—一个拼图碎片不能和其他碎片重叠。然后这个句柄会通过为适当的坐标轴设置属性来实现对碎片位置的更新。
最后, 重复前面的步骤,这次选择ManipulationCompleted 事件,在代码隐藏文件中,插入以下代码(高亮部分)到PhoneApplicationPage_ManipulationCompleted 方法体中。
(代码段– YourFirstWP7App – 练习 2 任务 3 步骤 7 –PhoneApplicationPage_ManipulationCompleted 事件句柄)
private voidPhoneApplicationPage_ManipulationCompleted(objectsender, ManipulationCompletedEventArgs e)
if (this.movingPieceId & -1)
int pieceSize = ImageSize / this.game.ColsAndR
Canvaspiece = this.puzzlePieces[this.movingPieceId];
// check fordouble tapping
if (TimeSpan.FromTicks(DateTime.Now.Ticks- this.lastTapTicks).TotalMilliseconds &DoubleTapSpeed)
// force move
this.game.MovePiece(this.movingPieceId);
this.lastTapTicks= int.MinV
// calculatemoved distance
DependencyPropertyaxisProperty = (this.movingPieceDirection % 2== 0) ? Canvas.LeftProperty : Canvas.TopP
doubleminRequiredDisplacement = pieceSize / 3;
doublediff = Math.Abs(Convert.ToDouble(piece.GetValue(axisProperty))- this.movingPieceStartingPosition);
// did it gethalfway across?
if (diff& minRequiredDisplacement)
// move piece
this.game.MovePiece(this.movingPieceId);
// restorepiece
this.AnimatePiece(piece,axisProperty, this.movingPieceStartingPosition);
this.movingPieceId= -1;
this.movingPieceStartingPosition= 0;
this.movingPieceDirection= 0;
this.lastTapTicks= DateTime.Now.T
注释:当用户完成对一个UIElement的操作,从手机触摸屏上抬起手指(或者释放按下的鼠标按钮)时将会触发ManipulationCompleted 事件,这个事件与MouseUp事件有些相似。这个事件的句柄会检查拼图碎片当前是否正在被移动。如果是,它会判断上次ManipulationCompleted 事件是什么时间被触发的,假如时间间隔比DoubleTapSpeed
所指定的值低,它会被此事件理解为Double Tap事件(或鼠标双击)并把此拼图碎片移动到邻近的空槽里。或者,它将计算拼图碎片与其目标位置之间的偏移距离,如果拼图碎片已经至少有三分之一的部分被移动到附近的槽里时,它将会完成碎片到空槽的移动;如果没有,它将会把拼图碎片拉回到原来的位置。
完成上述步骤后,打开页面的Properties窗口,检查您创建的事件句柄是否正确。如果您查看页面的XAML标记代码,您将会看到一些属性值,并且与PhoneApplicationPage元素中定义的属性相对应。
Properties窗口显示了操作的事件句柄
页面的XAML 标记代码 显示了事件的定制
要测试添加的multi-touch效果,需要按F5来构建和部署应用程序到模拟器上。等待版权页面的出现,然后点击START 来开始一个新的游戏。
在拼图板上拖拽图片碎片来完成游戏。要想移动一个拼图碎片,点击选中该碎片并把它拖拽到目标位。或者您还可以通过双击一个拼图碎片,使其移动到旁边可用的槽中。注意每次移动都会使拼图面板上的计数器增加。
解谜完成拼图
继续移动拼图碎片直到,您的游戏体验像是应用程序正运行在一个有触摸屏的真正设备上。当您感觉一切正常,回到Visual Studio中按下SHIFT + F5来结束调试进程。
创建动画效果
在Silverlight中,一个脚本就是一个动画。 每一个 脚本定义了包含有关键帧的时间轴。每一个关键帧可以独立地重新定义控件属性,例如位置、大小、旋转、透明度甚至包括对前景和背景色的定义。利用这种方法,用户不需要通过定义每一个帧来实现创建动画的操作,取而代之的是只需要提供时间轴上的选择点以及在该点标记重要属性的改变Silverlight 在相邻两个关键帧之间插入一些动画属性的值,从而生成一些中间帧并以此提供关键帧之间平滑的过渡。
每一个 脚本就是方法和事件的对象,您可以从页面的代码隐藏文件中找到它。它包含是一个动画启动、停止和暂停的方法以及一个单独事件完成,这个事件出现在动画停止播放的时候。
脚本可以被写成XAML代码,使用Expression Blend来创建的话会非常容易。
在这个任务中, 您将会创建一个当用户成功完成拼图游戏时要播放的脚本 。这个动画创建一个这样的视觉效果:拼图图片将沿其中间轴旋转同时显示一个围绕图片伴有逐渐会隐去的祝贺消息的框架。
首先, ,想页面中插入一个新的Resources 区段,如下面代码段(高亮的部分)所示。
&phone:PhoneApplicationPage
x:Class="WindowsPhonePuzzle.PuzzlePage"...&
&phone:PhoneApplicationPage.Resources&
&/phone:PhoneApplicationPage.Resources&
&Grid x:Name="LayoutRoot" Background="Transparent"&
&/navigation:PhoneApplicationPage&
注释: Resources提供了一个简单的方法来重用共同确定的对象和值。您可为通用条目创建定义包括控件模板、样式、画刷、色彩和动画脚本并把它们都存储在资源字典中。一个资源字典就是对象的键值字典,你可以在XAML和代码中使用该字典。您可以在您应用程序的结构中的不同范围内定义资源字典,允许您定义页面级或应用程序级的资源
在这个任务中,您可以利用页面的资源来存储动画脚本的定义。
接着,在Resources区段内部,插入一个当用户完成拼图时要播放的动画脚本来实现过渡目的。为实现这个目的,插入以下XAML标记代码(高亮部分)来定义WinTransition 动画脚本。
&phone:PhoneApplicationPage.Resources&
&Storyboard x:Name="WinTransition"&
&DoubleAnimationUsingKeyFrames BeginTime="00:00:00"Storyboard.TargetName="PreviewImage"Storyboard.TargetProperty="(UIElement.Opacity)"&
&EasingDoubleKeyFrame KeyTime="00:00:00"Value="0.2"/&
&EasingDoubleKeyFrame KeyTime="00:00:00.7000000"Value="1"/&
&/DoubleAnimationUsingKeyFrames&
&DoubleAnimationUsingKeyFrames BeginTime="00:00:00"Storyboard.TargetName="border"Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"&
&EasingDoubleKeyFrame KeyTime="00:00:00"Value="1"/&
&EasingDoubleKeyFrame KeyTime="00:00:00.7000000"Value="-1"&
&EasingDoubleKeyFrame.EasingFunction&
&CubicEase EasingMode="EaseInOut"/&
&/EasingDoubleKeyFrame.EasingFunction&
&/EasingDoubleKeyFrame&
&EasingDoubleKeyFrame KeyTime="00:00:01.7000000"Value="1"&
&EasingDoubleKeyFrame.EasingFunction&
&CubicEase EasingMode="EaseInOut"/&
&/EasingDoubleKeyFrame.EasingFunction&
&/EasingDoubleKeyFrame&
&/DoubleAnimationUsingKeyFrames&
&DoubleAnimationUsingKeyFrames BeginTime="00:00:00"Storyboard.TargetName="CongratsBorder"Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"&
&EasingDoubleKeyFrame KeyTime="00:00:00"Value="0"/&
&EasingDoubleKeyFrame KeyTime="00:00:00.7000000"Value="-1"&
&EasingDoubleKeyFrame.EasingFunction&
&CubicEase EasingMode="EaseInOut"/&
&/EasingDoubleKeyFrame.EasingFunction&
&/EasingDoubleKeyFrame&
&EasingDoubleKeyFrame KeyTime="00:00:01.7000000"Value="1"&
&EasingDoubleKeyFrame.EasingFunction&
&CubicEase EasingMode="EaseInOut"/&
&/EasingDoubleKeyFrame.EasingFunction&
&/EasingDoubleKeyFrame&
&/DoubleAnimationUsingKeyFrames&
&DoubleAnimationUsingKeyFrames BeginTime="00:00:00"Storyboard.TargetName="CongratsBorder"Storyboard.TargetProperty="(UIElement.Opacity)"&
&EasingDoubleKeyFrame KeyTime="00:00:01.2000000"Value="0"/&
&EasingDoubleKeyFrame KeyTime="00:00:01.3000000"Value="0"/&
&EasingDoubleKeyFrame KeyTime="00:00:01.4000000"Value="1"/&
&/DoubleAnimationUsingKeyFrames&
&/Storyboard&
&/phone:PhoneApplicationPage.Resources&
当用户赢得这个游戏时将会播放WinTransition 脚本。这个动画包含了完成后的拼图图片围绕其中轴线旋转,以及围绕拼图图片显示伴有逐渐隐去的祝贺信息的框架。
您可以在designer中使用一些工具例如Expression Blend来可视化设计动画属性并创建XAML标记代码来定义一个动画脚本。想获得如何利用Expression Blend来创建一个动画的说明,请参阅Hello Phone实验手册。
最终,当用户重新启动游戏时,为实现重启操作的过渡,插入一个动画脚本。
&phone:PhoneApplicationPage.Resources&
&Storyboard x:Name="WinTransition"&
&/Storyboard&
&Storyboard x:Name="ResetWinTransition"&
&DoubleAnimationUsingKeyFramesBeginTime="00:00:00"Storyboard.TargetName="CongratsBorder"Storyboard.TargetProperty="(UIElement.Opacity)"Duration="00:00:00.0010000"&
&SplineDoubleKeyFrame KeyTime="00:00:00"Value="0"/&
&/DoubleAnimationUsingKeyFrames&
&DoubleAnimationUsingKeyFrames BeginTime="00:00:00"Storyboard.TargetName="PreviewImage"Storyboard.TargetProperty="(UIElement.Opacity)"Duration="00:00:00.0010000"&
&SplineDoubleKeyFrame KeyTime="00:00:00"Value="0.23224"/&
&/DoubleAnimationUsingKeyFrames&
&DoubleAnimationUsingKeyFrames BeginTime="00:00:00"Duration="00:00:00.0010000"Storyboard.TargetName="GameContainer"Storyboard.TargetProperty="(UIElement.Opacity)"&
&EasingDoubleKeyFrame KeyTime="00:00:00"Value="1"/&
&/DoubleAnimationUsingKeyFrames&
&/Storyboard&
&/phone:PhoneApplicationPage.Resources&
注释:这个ResetWinTransition动画脚本隐藏了祝贺信息,并恢复拼图图片的不透明度到初始值。
在Solution Explorer上,右键单击 PuzzlePage.xaml并选择View Code ( ) 来打开这个页面的代码隐藏文件。
在PuzzlePage类的构造函数中,定位处理GameOver事件的匿名方法,并在方法开始处插入下面代码行(高亮部分)。
(代码段 – YourFirstWP7App – 练习 2 任务 4 步骤 5 – WinTransition 动画)
public PuzzlePage()
this.game.GameOver+= delegate
this.WinTransition.Begin();
this.TapToContinueTextBlock.Opacity= 1;
this.StatusPanel.Visibility= Visibility.V
this.TotalMovesTextBlock.Text= this.game.TotalMoves.ToString();
注释:当游戏结束,插入的代码播放动画脚本来提供完整的拼图图片和祝贺信息的视觉效果。
现在仍然在PuzzlePage类构造函数中,找到GameStarted事件的句柄,添加以下代码行(高亮部分)。
(代码段 – YourFirstWP7App – 练习 2 任务 4 步骤 6 – ResetWinTransition 动画)
public PuzzlePage()
this.game.GameStarted+= delegate
this.ResetWinTransition.Begin();
this.StatusPanel.Visibility= Visibility.V
this.TapToContinueTextBlock.Opacity= 0;
this.TotalMovesTextBlock.Text= this.game.TotalMoves.ToString();
注释:这个插入的代码将会在游戏启动时播放ResetWinTransition动画脚本。这个脚本会重置背景图片的状态并隐藏祝贺信息。
要测试最近的更改,按下F5,再次构建和部署应用程序到模拟器上。
一旦版权页被显示,点击START 来开始一个新游戏。
在这一点上,如果你愿意,你可以试图通过拖拽拼图板上的拼图碎片来完成整个游戏;否则,按下游戏面板上的SOLVE 按钮来完成拼图并结束游戏。注意当游戏结束,将会触发一个动画:拼图图片围绕中轴线旋转并在拼图板上方伴有视觉上逐渐消退的“CONGRATULATIONS ”文字说明。
完成拼图 显示祝贺信息
当您完成了验证,回到Visual Studio上按下SHIFT+F5来结束调试会话。
练习 3:使用独立的存储保存游戏的状态
, 您将更新这个应用程序来保存其状态,这样就可以在下次打开时继续这个游戏。要实现这个功能,您需要使用独立存储。
独立存储使托管的应用程序从独立存储中保存和获取信息。这个架构与Silverlight4中使用的架构非常相似。 所有的 I/O 操作被限制在独立存储的范围之类; 他们没有直接访问底层操作系统的文件系统。
使用独立存储还会带来的好处有应用程序之间的数据保护,定额管理以及遮障处理来保证应用程序仅仅处理它们自己的数据。
添加程序集引用以及其他Assets
利用独立的存储,您需要添加一个提供的助手文件和程序集引用到工程中。
如果还没有打开,则启动用于Windows Phone的Microsoft Visual Studio 2010Express :Start |All Programs | Microsoft Visual Studio 2010 Express | Microsoft Visual Studio2010 Express for Windows Phone.
Visual Studio 2010: 从操作系统的Start | All Programs |Microsoft Visual Studio 2010启动Visual Studio 2010。
如果您已经完成了前面练习中的所有步骤, 你将可以继续并利用您在之前练习中创建的解决方案;否则,从实验下的Source 文件夹中的Ex2-CreatingThePuzzleView\Begin处打开Begin.sln.
为System.Servicemodel.Web 程序集添加一个引用:
在Solution Explorer中的References文件夹上点击右键
选择 Add Reference
选择 .NET 标签
从组件列表中选择System.Servicemodel.Web 集合
为工程添加程序集引用
注释: System.Servicemodel.Web集合中包含了DataContractJsonSerializer,应用程序在保存对象到独立存储之前,使用JavaScript Object Notation(JSON)来序列化对象。
现在,添加一个助手类到工程中来处理独立存储:
在Solution Explorer中右键点击工程
选择 Existing Item
设置Browse值为实验目录下的Source文件夹中的Assets
选择 IsolatedStorageHelper.cs
注释: IsolatedStorageHelper 类包含把存储到独立存储和从独立存储中取回的对象序列化的方法。所提供的类包含好几个方法体的存根,您将会在本联系中来实现它们。
当完成添加引用和助手类文件操作后,这个已经更新过的解决方案应该类似:
SolutionExplorer 展示了新添加的组件
更新Puzzle UI
在这个任务中,您更新了游戏页面来提供3个按钮 ,允许用户加载,保存和删除游戏的状态。出于这个目的,您需要更改用户界面的XAML标记来定义所需的元素同时为每个按钮创建事件句柄。最后,您需要实现IsolatedStorageHelper中的方法,来完成加载,保存和删除序列化独立存储中的对象 。
在Solution Explorer中,双击PuzzlePage.xaml文件来打开包含此用户界面的页面
切换到XAML视图。双击designer窗口上右边框上的XAML标签,来实现更改视图使其最大化。如果您不方便找到正确的标签,可以把鼠标停留在每个标签上显示提示信息,从而找到正确的标签。
注释:如果您的实际工具视窗选择的是水平分隔视图,则标签将会被自动放置到视窗的下边缘。
在最后一个名为TapToContinueTextBlock的TextBlock元素中插入以下XAML标记代码(高亮部分)。
&Grid x:Name="LayoutRoot" Background="Transparent"&
&StackPanelOrientation="Vertical" VerticalAlignment="Top" Grid.Row="1"&
&Border x:Name="CongratsBorder"...&
&Border x:Name="border"...&
&TextBlock x:Name="TapToContinueTextBlock" HorizontalAlignment="Center" Text="Tap the picture to start thepuzzle"TextWrapping="Wrap" Foreground="#FFD0D0D0" FontSize="17.333"/&
&StackPanel Orientation="Horizontal"HorizontalAlignment="Center" &
&Button x:Name="LoadButton"Content="Load"Margin="10" /&
&Button x:Name="SaveButton"Content="Save"Margin="10" /&
&Button x:Name="ClearStorageButton"Content="Clear"Margin="10" /&
&/StackPanel&
&/StackPanel&
注释:添加的XAML标记代码将会页面添加三个按钮,它们将会加载、保存和清除保存在独立存储中的数据。
切换到Design视图,查看添加完新的按钮后用户界面所发生的变化。 要做到这点, 在设计工具desinger窗口右边缘上双击Design标签。
Design 视图显示了更新的用户界面
现在问每个按钮定义事件句柄:在designer上点击标记为“Load”的按钮,选中它并按F4来打开它的Properties窗口。
在 Properties 窗口中:
点击 Events 标签来显示可用事件列表窗口
在列表中 Click 事件,然后在事件旁的文本框中输入LoadButton_Click
点击Enter来生成一个以此命名的事件句柄,同时打开代码隐藏文件来显示Visual Studio产生的方法体存根。
插入以下代码(高亮部分)到LoadButton_Click 事件句柄内:
(代码段 – YourFirstWP7App – 练习 3 任务 2 步骤 7 – LoadButton_Click 事件句柄)
private voidLoadButton_Click(object sender, RoutedEventArgs e)
var gameState = IsolatedStorageHelper.GetObject&PuzzleState&("PuzzleState");
if (gameState == null)
MessageBox.Show("Sorry,no game state found.", "Oops!",MessageBoxButton.OK);
// set game state
this.game.SetState(gameState);
然后,在代码编辑窗口上右键点击并选择View Designer,切换回到Design视图。点击标记为“Save”的按钮,选中它并按F4来打开其Properties窗口。
在Properties 窗口上,点击Events 标签,并找到Click事件,在事件旁的文本框中输入SaveButton_Click 。点击Enter来生成一个以此命名的事件句柄,同时打开代码隐藏文件来显示Visual Studio产生的方法体存根。
插入以下代码(高亮部分)到SaveButton_Click事件句柄内:
(代码段 – YourFirstWP7App – 练习 3 任务 2 步骤 10 – SaveButton_Click 事件句柄)
private voidSaveButton_Click(object sender, RoutedEventArgs e)
// save game state
PuzzleState gameState = this.game.GetState();
IsolatedStorageHelper.SaveObject("PuzzleState", gameState);
然后再一次,在代码编辑窗口上右键点击并选择View Designer,切换回到Design视图。点击标记为“Clear”的按钮,选中它并按F4来打开其Properties窗口。
在Properties 窗口上,点击Events 标签,并找到Click事件,在事件旁的文本框中输入ClearStorageButton_Click。点击Enter来生成一个以此命名的事件句柄,同时打开代码隐藏文件来显示Visual Studio产生的方法体存根。
插入以下代码(高亮部分)到ClearStorageButton_Click事件句柄内:
(代码段 – YourFirstWP7App – 练习 3 任务 2 步骤 13 –ClearStorageButton_Click 事件句柄)
private void ClearStorageButton_Click(object sender, RoutedEventArgse)
// remove state and image
IsolatedStorageHelper.DeleteObject("PuzzleState");
现在, 在Solution Explorer 中,通过双击IsolatedStorageHelper.cs 文件来打开它。
找到 GetObject&T& 方法并用下面代码(高亮部分)替换其方法体:
(代码段 – YourFirstWP7App – 练习 3 任务 2 步骤 15 – GetObject 方法)
public static TGetObject&T&(string key)
if (IsolatedStorageSettings.ApplicationSettings.Contains(key))
string serializedObject = IsolatedStorageSettings.ApplicationSettings[key].ToString();
return Deserialize&T&(serializedObject);
return default(T);
注释: The GetObject&T&method retrieves an object from isolated storage given its key. It takesadvantage of the IsolatedStorageSettingsclass that stores a dictionary of key-value pairs in isolated storage.
Objectsare stored in serialized format using the DataContractJsonSerializerprovided in the
System.ServiceModel.Webassembly, which serializes objects to the JavaScript Object Notation (JSON) anddeserializes JSON data to objects.
接着,插入下面代码(高亮部分)到 SaveObject&T&方法体中:
(代码段 – YourFirstWP7App – 练习 3 任务 2 步骤 16 – SaveObject 方法)
public static void SaveObject&T&(stringkey, T objectToSave)
string serializedObject = Serialize(objectToSave);
IsolatedStorageSettings.ApplicationSettings[key] =serializedO
注释: SaveObject&T& 方法存储一个赋有键值的对象到独立存储中,这个键值被用来从存储中取回对象。
最后,利用下面代码(高亮部分)实现 DeleteObject&T&方法 :
(代码段 – YourFirstWP7App – 练习 3 任务 2 步骤 17 – DeleteObject 方法)
public static void DeleteObject(stringkey)
IsolatedStorageSettings.ApplicationSettings.Remove(key);
注释: DeleteObject方法根据给定的对象键值从独立存储中移除它。
在这个任务中,您将会在Windows Phone Emulator上构建和运行这个完成的应用程序。测试一个独立存储的使用,您需要启动一个新的游戏并移动拼图碎片。 然后,保存游戏状态并关闭它。接着,您不止一次再次启动应用程序,来恢复所保存的状态,使得游戏恢复到与关闭应用程序之前的状况一致。
, press F5 在模拟器上再次构建和部署应用程序。等待版权页的出现然后点击START 来开始一个新的游戏。
在游戏页面, 点击 Load 试图恢复到任何一个保存的状态。注意,可想而知地,将会显示一个错误页面显示没有程序运行。点击OK来关闭错误消息。
当没有保存任何先前的状态,加载操作将会失败
拖拽拼图板上的一些拼图碎片。
最好是您能排列拼图碎片到一种样式,使您能很容易记住一个或更多碎片。这样做将会很容易来判断您随后重新加载游戏后,您获得了相同的拼图样式。
点击Save来保存当前游戏的状态。
现在,继续移动碎片直到你有一个完全不同的排列,但是不要点击保存。
再一次,点击Load 来恢复以前保存的状态。注意这次,拼图板上的拼图碎片位置发生了改变,恢复到了之前您保存游戏状态时拼图板相同的样式。
在模拟器窗口上点击Back按钮( )直到切换到包含着版权页的主页面。接着,再次点击Back按钮来退出应用程序并显示Quick Launch菜单。
现在,从Quick Launch菜单重新启动应用程序 。要实现这一点,点击箭头按钮到“All Applications.”
在Quick Launch菜单访问 “All Applications”
在安装程序列表中, 点击 Windows Phone Puzzle 并再次启动应用程序。
从Quick Launch菜单上启动应用程序
注释: 当您退出应用程序,VisualStudio会分离调试器。在模拟器中仍然保存着应用程序镜像,您可以随时重新启动它。注意,无论如何,当您这样做时应用程序不再运行在调试器上。
点击START来开始一个新的游戏,然后在游戏页面中点击Load 来恢复之前保存的状态。验证拼图板的样式和之前您退出程序前保存的状况是一致的,这就证明了即使您退出了应用程序,独立存储也被保留了。
点击Clear,擦除独立存储中保存的状态。
现在,再次点击Load,注意您这次接收到了您在开始时看到的相同错误信息,表明您已经成功清除了保存的状态。
这个实验带领您完成了利用针对Windows Phone的Microsoft Visual Studio 2010 Express 来开发一个用于Windows Phone应用程序的Silverlight。在这个实验的过程中,您创建了一个使用Extensible Application MarkupLanguage (XAML) 开发的用户界面并看到了如何编写应用程序逻辑以及添加代码以响应输入事件。您了解到Windows Phone应用程序如何处理多点触摸的输入来操控用户界面上的元素,以及如何运用动画效果来改善用户体验。最后,您还探讨了利用独立存储来保存应用程序状态的方法。
没有更多推荐了,

我要回帖

更多关于 汤姆猫跑酷 的文章

 

随机推荐