




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
概 练习 任务1–增加MockIAPLib库支 任务2–添加永久任务3–测试永久任务4–添加消费任务5–测试消费练习 任务1–添加和技 任务2–在UI上增加应用任务3–测试应用总 概WindowsPhone应用的一个重要功能是——初次应用,然后通过内置功能应用的扩展,启用模块或者提供消费项目。所有的来自WindowsPhone商店的,都使用一个很著名并安全的API.因为您将在本实验中使用WindowsPhone模拟器,而它没有WindowsPhone商店的权限,我们将结合一个模拟库,模拟WindowsPhone商店API,来开发和测试应用内,而无需连接到商店。模拟调用库叫MockIAPLib,将被添加到我们的演示应用中来执行以下任务。你可以使用一个开发者过的WindowsPhone设备和一个可用的WindowsPhone商店账号来实MockIAPLib就不是必须的。注意:本实验不包括和功能请到Phone8app。WindowsPhone信息,请参阅MSDN目需 VisualStudioExpress2012forWindowsPhone或 VisualStudio2012withtheWindowsPhoneSDK一些WindowsPhone实验结3MockIAPLib启用应用内(从试用版的转换测试机估计完成时60在本练习中,修改ContosoCookbook应用,以使在应用内配方组和烹饪时间模块。我们加入MockIAPLib库用来在WindowsPhone模拟器上测试WindowsPhone商店的API,而无需开发者的设备。在ContosoCookbook应用中,用户将使用应用内,能比在最初版本的应用里浏览如,考虑第一人射击游戏的,或流应用程序的时间。在ContosoCookbook应用中,用户将使用应用内,各种配方的烹饪(分钟),并使用设置一个提醒,当烹调时间结束时,的试用结束。当的事件使用完了后,它会。如果用户想再次使用必须重新。任务1增加MockIAPLib库支在这个任务中,我们要增加MockIAPLibWindowsPhone模拟器的应用程序。然后,我们将添加为WindowsPhoneStoreAPI的支持,在实际设备上使用。注注意MockIAPLib库代码会被加在"#ifDEBUG"条件块之下。要运行带WindowsStoreAPI“Release”或者删除“DEBUG”“DEBUG”的Debug和Release/en-:导航到EX1begin打开ContosoBookbook.sln定位到"References"并选择"AddReference…"(增加),通过点击“浏览”来找到MockIAPLib库定位到Assets文件夹,并增加MockIAPLib.dll作为一个#define#define#defineusingusingSystem.Xml.Linq;#ifDEBUGusingusingStore=MockIAPLib;usingStore=注意:如果是”DEBUG”编译块,WindowsPhone商店API。MockIAPLib库APIWindows.ApplicationModel.StorepublicstaticStore.ListingInformationIAPListingInformation{get;MockIAPLib或WindowsPhone应用APIprivateasyncvoid{#if//UseMockAPIinsteadofrealstore#if//Clearthecacheeverytime.Removethistohavepersistence.varsri=App.GetResourceStream(newUri("Data\\MockupLicenseInfo.xml",Xdoc=X.Load(sri.Stream);stringxml=doc.ToString();MockIAP.SetListingInformation(1,"en-us","ContosoCookbookssampleapp","$5.99","ContosoCookbooks");#ifStore.CurrentApp.LicenseInformation.IsTrial=true;//LoadassociatedproductlistingsIAPListingInformation=await}注意:如果是注意:如果是Debug“#ifDEBUGMockIAPLibSetListingInformationxml文件来加载模拟的信息到的MockIAPLib库。如果使用WindowsPhone商店,信息会被加到商店管理UI中,这当使用MockIAPLib库时,我们可能会使得后保持应用启动时重新清除MockIAPLib库DONT_PRESERVE_LICENSE_INFO”条件编译块控制。安装阶段完成后,前面代码的最后一行使得应用可以从WindowsPhone商店API通过LoadListingInformationAsync方法获取当前信息。此方法不管我们是否使用MockIAPLib库或真正的WindowsPhone商店API,都能返回所有能的和当前用户可的信息。找到"Data"文件夹并导航到Data文件夹中的文件选择器,并选择MockupLicenseInfo.xmlMockupLicenseInfo.xml文件包含MockIAPLib库所需的信息。在真实设备上,这些信息将被从WindowsPhone商店加载。证文件中了ProductListingsXML元素,它包含可用于的列表。每个ProductListing元素了产品的名称和描述,它的唯一标识符,其产品类型(常用或消费XML格式可以被用来设定一系列搜索关键字或者应用中的”Tag”元素。xml格式被用来传递数据的应用程序的产品。在ContosoCookbook应用,我们在时使用”Tag”元<ProductListingKey="Italian"Purchased="false"<Name>Italian<Description>ItalianrecipespackforContosoCookbooksThisrecipepackincludesthefollowingLemonLinguinewithSpaghettiCapreseappdata:///Images/Italian/italiangroup.png</ImageUri> 任务2添加永#if#ifusingusingStore=MockIAPLib;usingStore=这些代码和之前加过的一样。我们要在所有需要用MocklAPLibFeatures类License.Phone.Store.LicenseInformation_infoprivateprivatestaticStore.LicenseInformation_info#if就像之前。DebugMockIAPLib。Release版本设定我们使用WindowsPhoneStoreAPI的LicenseInformation。要在UI中正确显示食谱菜单组,我们需要确定一个组是否已经被用户。增加下面internalinternalstaticboolIsGroupLicensed(string{{varproductListingvarliveInfo=varliveInfo=return}return}我们现在修改配方(当应用启动时的)数据源来支持模块。打开DataModel\RecipeDataSource.cs文件。找到的LoadLocalDataAsync找到“foreachgroup.Items.Add(recipe)方法调用,在该方法调用之前添if(!Features.License.IsGroupLicensed(group.UniqueId))group.LicensedRequired=true;我们现在设定本组的LicensedRequired属性的IsGroupLicensed方法。现在,我们已经创建增加一个组内的应用内支持打开GroupDetailPage.xaml定位到第二个controls:PivotItem元素,定位到内部的controls:PivotItem.Header元素,然后加上下面的xaml代码到内部的StackPanel元素的尾部。就在TextBlock <ImageVisibility="{BindingConverter={StaticResourceHorizontalAlignment="Right"VerticalAlignment="Center"Margin="15,0"前面的XAML代码当LicensedRequired属性设置为true时的一个锁定图标。通过提供一个XML配置文件或配置的WindowsPhone商店,我们无论应用是否在状态,在UI上,部分组是免费提供的。其它一些组将保持锁定状态,并且可以通过应用程序的永久后。定位到lstRecipes_SelectionChangedelseifgroup.LicensedRequiredgroup.UniqueId,VisualStudio解决方案资源管理器中右键单击该项目,并添加了新的一个WindowsPhoneProductInfoPage.xaml. :SystemTray.IsVisible元素为False(默Background{StaticResource{StaticResource用下面的代码替换TitlePanelStackPanel<Imagex:Name="imgLogo"Source="Assets/Title.png"<TextBlockx:Name="PageTitle"Text="ProductInfo"Margin="9,-7,0,0"Style="{StaticResourcePhoneTextTitle1Style}"Foreground="{StaticResourceCustomGroupTitleBrush}"/>UI控件用于显示产品信息。更改的内容的ContentPanel<RowDefinition<RowDefinition<RowDefinition<RowDefinition<RowDefinition<TextBlockText="{BindingName}"Grid.ColumnSpan="2"Style="{StaticResourcePhoneTextTitle2Style}"Foreground="{StaticResourceCustomGroupTitleBrush}"/><TextBlockText="{BindingDescription}"TextWrap Grid.Column="0"Grid.Row="1"Style="{StaticResource<StackPanelGrid.Column="0"Grid.Row="2"Orientation="Vertical"Margin="0,<TextBlockText="Producttype:"Style="{StaticResourcePhoneTextSmallStyle}"<TextBlockText="{BindingProductType}"Style="{StaticResourcePhoneTextSmallStyle}"Foreground="{StaticResourceCustomGroupTitleBrush}"/><StackPanelGrid.Column="0"Grid.Row="3"<TextBlockText="Purchaseprice:"Style="{StaticResourcePhoneTextSmallStyle}"<TextBlockText="{BindingFormattedPrice}"Style="{StaticResourcePhoneTextLargeStyle}"Foreground="{StaticResourceCustomGroupTitleBrush}"<ImageSource="{BindingImageUri}"Grid.Column="1"Grid.Row="1"<ButtonGrid.Row="4"Grid.Column="0"Content="Buynow"x:Name="btnPurchase"Background="{StaticResourceCustomGroupTitleBrush}"HorizontalAlignment="Stretch"VerticalAlignment="Bottom"/><ButtonGrid.Row="4"Grid.Column="1"Content="Cancel"x:Name="btnCancel"Background="{StaticResourceCustomGroupTitleBrush}"HorizontalAlignment="Stretch"VerticalAlignment="Bottom"/>前面的代码实现了ProductInfoPage.xaml的的页面,用来显示产品的信息给用户,使用户using #ifusingusingStore=MockIAPLib;usingStore=ProductListingproductInfo=null;stringgroupId="";public{}OnNavigatedToprotectedoverridevoidOnNavigatedTo(NavigationEventArgs{groupId=productInfo=#ifif(null!={//Tweakimagestrings=productInfo.ImageUri.OriginalString;s=s.Rece("ms-appdata://","");productInfo.ImageUri=newUri(s,}this.Dontext=productInfo;}上面的代码获取当前的组标识符的导航查询字符串,并加载该组的产品信息。在Debug版本配置下通过条件编译,代码会显示一个产品(在WindowsPhone商店API下不privateasyncvoidbtnPurchase_Click_1(objectsender,RoutedEventArgs{varreceiptawaitStore.CurrentApp.RequestProductPurchaseAsync(productInfo.ProductId,if(productInfo.ProductType=={vargroup=App.Recipes.FindGroup(groupId);group.LicensedRequired=}}privatevoidbtnCancel_Click_1(objectsender,RoutedEventArgs{}当用户点击“”按钮,我们使用API(MockIAPLib或者WindowsPhone商店)试图。API可能会显示附加的页面给用户,诸如验证步骤,然后再返回产品的食注注意:RequestProductPurchaseAsync-一个产品ID和一个布尔变量,XML文档。该文档可以被用作应用验证操作是否成功。ContosoCookbook应用不使用此功能。LicensedRequired属性为相反的当前值。换句话说,如果了,此组并不再需要一个许任务3测试永主页锁定组页滚动顶部的pivotcontrol“Recipes”pivot食谱组页信弹出"MockUI注意:在注意:在Release版本中,这些消息会被WindowsPhoneStoreUI图MockUI消点击 食谱页主页任务4添加消在这个任务中,我们加入消费的支持打开App.xaml.cspublicstaticintRemainingCookingTime{get;set;privatevoid{RemainingCookingTime=}SettingsRemainingCookingTime为了支持消费,一些对Common\Features.cs的改动是必须的。我们会添加一些新的ContosoCookbook,可的消费产品烹饪时间包。我们现在就增加代码来做消费购在Features类内部增加一个内部类。这个类包含所有的消费的信息publicpublicstaticclass{publicstaticint{intremainingCookingTime=varappSettings=varappSettings=if(appSettings.Contains("RemainingCookingTime"))remainingCookingTime={remainingCookingTime=}return}publicstaticvoidSetRemainingCookingTime(int{varappSettings=if(appSettings["RemainingCookingTime"]!=null)appSettings["RemainingCookingTime"]=}}NotificationsSetReminder方法ifIsScheduled(item.UniqueId“ifvarschedule=ScheduledActionService.Find(item.UniqueId);if(null!=schedule)在上面的代码中,如果我们发现已经有一个计时器处于激活状态,其删除,并创建“if//ConsumeApp.RemainingCookingTime-=item.PrepTime;//RedeemtimeasusercancelledApp.RemainingCookingTime+=item.PrepTime;下一步,我们修改应用程序,以使用户烹调时间。打开privateboolHasEnoughCookingMinutes(int{if(App.RemainingCookingTime>=duration)returntrue;return}定位到btnStartCooking_Clickif(HasEnoughCookingMinutes(item.PrepTime)||{}newUri("/ProductSelectionPage.xaml?Keyword=minutes",上面的代码调用HasEnoughCookingMinutes方法以确保用户了足够的时间。如果没有,我们会将用户转到ProductSelectionPage.xaml页面,这将允许额外的时间。在接下来的几个步骤中,添加此页。VisualStudio解决方案资源管理器中右键单击该项目,并添加新的“Windows纵向页面”,命名为ProductSelectionPage.xaml改变 :SystemTray.IsVisible为False(默认要显示应用程序的徽标和标题,LayoutRoot的Grid元素的background{StaticResource{StaticResourceTitlePanelStackPanel<Imagex:Name="imgLogo"Source="Assets/Title.png"Stretch="Uniform"HorizontalAlignment="Left"Width="{StaticResourceLogoImageWidth}"/><TextBlockx:Name="PageTitle"Text="Products"Margin="9,-7,0,0"Style="{StaticResourcePhoneTextTitle1Style}"Foreground="{StaticResourceCustomGroupTitleBrush}"/>我们现在增加一些主要UI控件来显示产品列表(时间单位)ContentPanel的Grid<RowDefinition<RowDefinition<StackPanelGrid.Row="0"<TextBlockText="Youdon'thaveenoughcookingtimeleft!"Style="{StaticResourcePhoneTextSmallStyle}"Foreground="{StaticResourceCustomGroupTitleBrush}"/><TextBlockText="{BindingStringFormat='Yourremainingtimeis\{0:D\}minutes'}"Style="{StaticResourcePhoneTextSmallStyle}"<TextBlockText="PleasepurchaseadditionaltimefromtheproductsStyle="{StaticResourcePhoneTextSmallStyle}"Foreground="{StaticResourceCustomGroupTitleBrush}"/><ListBoxGrid.Row="1"x:Name="lstProducts"ItemsSource="{Binding}"SelectionChanged="lstProducts_SelectionChanged_1"Margin="10"> <Border<BorderBorderBrush="{StaticResourceMargin="0,5"<RowDefinition<RowDefinition<ColumnDefinition<ColumnDefinition<TextBlockText="{BindingValue.Name}"<TextBlockText="{BindingValue.Description}"Grid.Row="1"TextWrap <TextBlockFontWeight="Bold"Grid.Column="1" 找到并打开最近新创建的ProductSelectionPage.xaml.cs#if#ifusingusingStore=MockIAPLib;usingusingStore=用以下代码代替public{}protectedoverrideasyncvoidOnNavigatedTo(NavigationEventArgs{stringsearchTerm=NavigationContext.QueryString["Keyword"];varresults=await {searchTermlstProducts.Dontext=results.ProductListings;txtRemainingCookingTime.Dontext=App.RemainingCookingTime;awaitStore.CurrentApp.LoadListingInformationAsync();}privatevoidlstProducts_SelectionChanged_1(object{if(lstProducts.SelectedIndex>-{varselection=Uri("/ProductInfoPage.xaml?ID="+}}载列表。然后,我们结合该列表的lstProducts页面上的控件,使用户可以选择的产品。当用户选择一个产品,然后导航到之前添加的ProductInfoPage.xaml页来完成。现在,我们添加用于消费品的ProductInfoPage.xaml页面的支持。打开找到的btnPurchase_Click_1的的处理程序中elseif(productInfo.ProductType=={if{//Fulfill--appApp.RemainingCookingTime+=int.Parse(productInfo.Tag);//Report}}要消费类产品,上面的代码中添加到App.RemainingCookingTime的属性中并报告产品的完成。产品实现了的消费产品已经充分提供给用户,所以完成了。任务5测试消任务主应用页点击的配方的配滚动pivotpivot食谱组页点击屏幕底部的锁图标食谱页当"Products"页面打开后,提供时间。假设你没有足够时间烹饪产品点击"10Minutes"然后点击“Buynow”来确认作为一个应用程序开发人员,您可以上传到WindowsPhone商店,它是免费的,没有试用期或其者功能限制。在后一种情况下,你可以通过来启用被禁用的功能。这是我们在ContosoCookbook上试用的方案。在本练习中,修改ContosoCookbook应用。使应用从试用到完整的功能的。然后,我任务1–添加和技为了支持,我们现在到Common\Features.cs文件做一些修改。添加一些新的方法,定位到 类privateprivatestaticbool_isTrial=false;publicstaticboolIsTrial{{return_isTrial;}}privateprivatestaticvoid{if(null==_info=#ifisTrial=_isTrial=}上面的代码会从MockIAPLib库或真正的WindowsPhone商店API(API)获取当前信息,并设置_isTrial的当前状态。publicpublicstaticvoid{#if//Simulateappstringmessage="Thissampledemonstratestheimplementationofaapppurchaseprocess.\n"+"Press"Press'OK'tosimulatesuccessfulpurchase.\nPress'Cancel'tokeeprunningtheappintrialmode.";if(MessageBox.Show(message,"DebugTrial",MessageBoxButton.OKCancel)==Store.CurrentApp.LicenseInformation.IsTrial=false; ceDetai
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 铺面租赁合同范本
- 人教部编版八年级上册与朱元思书教学设计
- 小学二年级机械结构课程教学设计 14猴子爬杆
- 1.2思维形态及其特性课件高中政治统编版选择性必修三逻辑与思维 -
- 证券行业每年工作计划
- 《第12课 认识WPS》教学设计教学反思-2023-2024学年小学信息技术人教版三起四年级上册001
- 采购合同合同管理专业团队培养重点基础知识点
- 采购合同风险财务风险法律咨询重点基础知识点
- 二零二五版美容卡合同范例
- 居间合同中介合同二零二五年
- 2021麓湖生态城-麓客社群实操及方法论
- Unit 3 Section A 3a-3c【 核心精讲+备课精研+高效课堂 】八年级英语下册单元 课件(人教版)
- 美术《印象主义-莫奈》教学课件
- 知识图谱课件
- Taboo and Euphemism 禁忌语和委婉语课件
- 内科体检操作课件
- 薪酬管理第6版第9章课件
- 高中历史选修二 第12课 水陆交通的变迁 课件(51张)
- JJF(纺织)062-2010 电子式织物强力机校准规范-(高清现行)
- 最新北师大版小学六年级数学下册第二次月考(3~4单元)检测试卷附答案
- 非计划再次手术管理制及流程
评论
0/150
提交评论