版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、此文档供上网不便的朋友使用,仅供学习交流使用。此文档不能复制,鼓励手敲代码,毕竟拖控件粘代码始终是不好的事情。如果实在是需要,可以到博客上面来复制代码 HYPERLINK /fengyun1989/article/details/7346223 /fengyun1989/article/details/7346223另外,此文档由于做得倡促,写博客的时候随便粘过来的。没有好好排版,如果看得不爽请到博客里看原文。(一)手把手教你写天气预报程序:序言 先来展示下程序的效果图吧 这个程序虽小,但是基本的东西都是具有的。说下用到的具有特色的知识点(简单的不说了):UserControl,WebClie
2、nt请求,Json数据解析,XML数据解析,TombStone,IsolatedStorage存储,本地数据库SQL CE。上面的每个知识点要写都是一个Demo。此例子展示怎么将所有知识点联系到一块做一个实在的应用。Window phone开发,我感觉现在这样的中文实例教程很少。我的英语水平也不好,按照教育部的说法,六级没过,那些神马英文教程,勉强能看,但那也是相当纠结的事情。我估计还有不少不爱看英文教程,看到英文就头疼的爱好WP7开发的入门者,所以打算写这么一个教程,尽量详细到每一步,尽量把分析思考写出来。如写的不好,尽请见谅。 写一个新手看的懂,让他们能做出这么一个可以用的应用增加一点自信
3、心。最后一句:新手请进,老鸟飘过(二)手把手教你写天气预报程序:UserControl的运用 那么,开始吧。首先确认安装了window phone SDK(没有的先去安装,SDK自带VS2010 Express版,还有就是电脑系统要是win7,XP不支持微软原版的模拟器,不过可以使用传智播客做的模拟器,具体自己百度)。如果本来安装了VS2010 ultimate的。可以用之开发,但是确认升级到了SP1版,不然不能使用,而且,如果本来的VS2010是中文版,那么需要到C:Program FilesMicrosoft Visual Studio 10.0Common7IDEProjectTempl
4、atesCSharp(C盘为SDK安装目录),复制Silverlight for Windows Phone文件夹(此为window phone模板)到C:Users用户名DocumentsVisual Studio 2010TemplatesProjectTemplatesVisual C#下,这样原来的中文版VS2010就能识别window phone模板了。 打开VS2010。无论你打开的是中文版的还是英文版的,我用的是中文版的,我下面所说的操作大部分都是中文的。如果你英文不好还要用英文版的(虽然基本没几个英文单词),如果找不到我也没办法了(不过大部分应该都附图)。 点击文件新建项目,在
5、左边的模板里面选择visual C#,然后再选择silverlight for window phone,然后在右边选择 window phone application。填入名称:WeatherForecast 具体如下图:点击确定。然后在这个弹窗,选择OS 7.1,点击OK。现在也可以点击运行。 运行方法:先看这 绿色三角后面选择的是Emulator,就是模拟器。还有一个选项是Device,就是手机。确认选择的是模拟器,点击绿色三角或者按F5运行。运行成功! 我觉得这么一个程序,首先应该要能够获取到天气信息展示到界面。先分析下界面应该怎么做吧。新手看到这么复杂的界面大部分还真是无从入手。
6、观察界面,就是一个Grid的布局。但是麻烦的是右边的预报后几天天气的布局。单靠grid布局达不到如此效果。所以把这做成UserControl。这样更容易布局。也可以展示下UserControl的应用。现在,先添加一个UserControl。在右边的解决方案管理器,在WeatherForecast上右键,添加,新建项。添加一个window phone user control。命名为ForecastTemplate,点击添加,如图:在ForecastTemplate.xaml。里面的name为LayoutRoot的grid里面添加两个TextBlock,一个Image。具体代码如下: 现在在左边
7、的设计框显示的是这样的: 我们需要从外部给这个UserControl的Textblock或者Image的属性赋值,那么需要给ForecastTemplate这个类添加成员变量来控制Textblock或者Image的属性。那么。转到ForecastTemplate.xaml.cs页面。也就是在ForecastTemplate.xaml的代码页面,右键,查看代码。就看到了。在ForecastTemplate.xaml.cs页面,在ForecastTemplate类中添加如下的成员。/定义Image的Source属性。这样这个用户控件就能从外面访问到这个Image控件的Source属性了 priva
8、te string _imageUri; public string ImageUri get return _imageUri; set _imageUri = value; BitmapImage bmp = new BitmapImage(new Uri(value, UriKind.Relative); WImg.Source = bmp; /定义了TextBlock的Text属性。外头就可以给这个Text属性赋值了 private string _weekday; public string Weekday get return _weekday; set _weekday = va
9、lue; ; weekday.Text = value; private string _temp; public string Temp get return _temp; set _temp = value; temp.Text = value; 是否发现在这显示红色波浪线? 因为没有引入命名空间。在BitmapImage上右键。解析,选择第一个Using。这样就引入了命名空间。这里提这个主要是给新手提个醒,遇到错误不要着急。先看清楚是什么状况。解决就好了。现在转到MainPage.xaml页面。先添加命名空间。xmlns:my=clr-namespace:WeatherForecast贴
10、图展示命名空间添加位置 正确添加命名空间。智能提示就能访问到Usercontrol 现在添加一些图片资源文件到工程。我这工程添加的图片资源可以到这下载: HYPERLINK 上一节完成后,程序已经能够正常运行了。基本功能都完成了。是不是有种很不出的感觉呢。大家都应该听说过会这个墓碑机制了吧。因为window phone 是单任务系统,为后台程序留了5个坑。程序一旦进入后台,就休眠了。被埋在坑里了,就不再运行了。只有你按返回键才能从进入休眠的后台程序。不过,我觉得还有两个问题,第一个就是如果程序在后台,你从启动器启动程序,就是不是按返回键进入程序,那么程序就重新运行了。原来后台的数据就没了,这个
11、是一个用户体验很不好的地方,比如我,就是不喜欢按返回键进入程序的,喜欢从启动器进入后台程序。第二个,就是只有5个坑,一旦你的程序进入后台之后,又有5个程序进入后台,那么你程序埋在坑里的尸体就被抛尸荒野了。再也不能从后台进入了,只能从启动器重新打开。那么,怎么解决呢,大家都是喜欢多任务运行的。我们就来模拟一把吧。模拟之前,先要了解程序的生命周期,这些大家还是百度吧。现在只是简单说下涉及到声明周期要使用到的函数。在App.xaml.cs里面定义了那么4个函数,Launching,Activate,Deactivate,Closing。Launching在程序启动的时候执行。Deactivate在用
12、户点击开始键或者其他导致程序进入后台的操作时候执行,Activate在用户按返回键进入程序的时候执行。closing不用多说,看名字就知道。在程序关闭的时候执行。在我们这个程序,也就在设置页面的时候如果中断运行进入后台的话才需要恢复,所以相对简单些。我的方案是:定义了两个变量,一个是保存当前所在页面的CurrentPage(保存到PhoneApplicationService),一个是保存是否中断到后台的Recovery。.在Deactivate函数里面保存需要的相关值和上面两个变量到Isolatedstorage。并且在Launching的时候把原来Deactivate保存的值取出来。然后再
13、PageLoad 的时候判断是否是中断恢复。是的话就导航到相关页面,然后恢复界面值。恢复完成,Recovery设置为false,并且保存到Isolatedstorage。在写代码之前,还要了解的是每个Page里面都有两个事件,OnNavigatedFrom和OnNavigatedTo,前者就是离开页面的时候执行,后者是进入页面的时候执行。重载这两个事件就能用了。下面先修改App.xaml.cs的代码:(代码中可能没添加命名空间,自己加吧,很简单)IsolatedStorageSettings iss = IsolatedStorageSettings.ApplicationSettings;
14、private void Application_Launching(object sender, LaunchingEventArgs e) /如果数据库不存在则创建一个数据库,并且存入相关数据 CreatDB(); l region 把Deactivate保存的相关数据取出来 string temp; if (iss.TryGetValue(LastPage, out temp) PhoneApplicationService.Current.StateCurrentPage = temp; int index; if (iss.TryGetValue(cityIndex, out ind
15、ex) PhoneApplicationService.Current.StatecityIndex = index; if (iss.TryGetValue(provIndex, out index) PhoneApplicationService.Current.StateprovIndex = index; #endregion private void Application_Deactivated(object sender, DeactivatedEventArgs e) #region 程序即将进入后台,保存中断情况的相关数据 issRecovery = true; if (Ph
16、oneApplicationService.Current.State.ContainsKey(cityIndex) isscityIndex = PhoneApplicationService.Current.StatecityIndex; if (PhoneApplicationService.Current.State.ContainsKey(provIndex) issprovIndex = PhoneApplicationService.Current.StateprovIndex; if (PhoneApplicationService.Current.State.Contains
17、Key(CurrentPage) issLastPage = PhoneApplicationService.Current.StateCurrentPage; #endregion private void Application_Closing(object sender, ClosingEventArgs e) /退出, issRecovery = false; 下面修改MainPage的代码:(PageLoad修改如下)private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) #region 判
18、断是否是中断进入 IsolatedStorageSettings iss = IsolatedStorageSettings.ApplicationSettings; bool recov; if (iss.TryGetValue(Recovery, out recov) if (recov) if (PhoneApplicationService.Current.State.ContainsKey(CurrentPage) string temp = Convert.ToString(PhoneApplicationService.Current.StateCurrentPage); if
19、(!temp.Equals(MainPage.xaml) & temp.Length 0) NavigationService.Navigate(new Uri(/WeatherForecast;component/ + temp, UriKind.Relative); else issRecovery = false; else PhoneApplicationService.Current.StateCurrentPage = MainPage.xaml; else PhoneApplicationService.Current.StateCurrentPage = MainPage.xa
20、ml; #endregion UpdateWeather(); 我们主要做的是SetPage的中断进入后台的处理,所以,要重载OnNavigatedFrom事件来保存两个Listpicker的SelectedIndex。而且,要在PageLoad的时候判断是否是中断返回,如果是那么就恢复。不是就常规绑定。下面是修改或者增加的代码: private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) #region 判定是否是中断退出后进入,是就恢复数据 IsolatedStorageSettings iss =
21、IsolatedStorageSettings.ApplicationSettings; bool recov; if (iss.TryGetValue(Recovery, out recov) if (recov) if (PhoneApplicationService.Current.State.ContainsKey(CurrentPage) string temp = Convert.ToString(PhoneApplicationService.Current.StateCurrentPage); if (temp.Equals(SetPage.xaml) int provInde
22、x = 0; int cityIndex = 0; if (PhoneApplicationService.Current.State.ContainsKey(provIndex) provIndex = Convert.ToInt32(PhoneApplicationService.Current.StateprovIndex); if (PhoneApplicationService.Current.State.ContainsKey(cityIndex) cityIndex = Convert.ToInt32(PhoneApplicationService.Current.Stateci
23、tyIndex); RecovListPickerItems(provIndex, cityIndex);/恢复数据 issRecovery = false;/设置为已经恢复 else ProvLpDataBind(); else ProvLpDataBind(); else ProvLpDataBind(); else ProvLpDataBind(); #endregion PhoneApplicationService.Current.StateCurrentPage = SetPage.xaml; / / 恢复数据的时候绑定city的ItemSource,并且绑定两个ListPicke
24、r的当前选项 / / / void RecovListPickerItems(int provIndex, int cityIndex) provincelp.ItemsSource = prov; if (provIndex = prov.Length) provIndex = 0; provincelp.SelectedIndex = provIndex; List l = cityDataBind(provprovIndex); if (cityIndex = l.Count() cityIndex = 0; citylp.SelectedIndex = cityIndex; / / 离
25、开页面保存当前两个ListPicker的selectedIndex / / protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) base.OnNavigatedFrom(e); PhoneApplicationService.Current.StateprovIndex = provincelp.SelectedIndex; PhoneApplicationService.Current.StatecityIndex = citylp.SelectedIndex; 这样
26、,多任务模拟就完成了。无论是从返回键返回程序还是从启动器启动返回程序。都行。不过,如果要做的页面太多,控件太多还真是很麻烦的。PS:这里的断点调试技巧:由于要测试从启动器恢复程序,但是编译器调试的时候,一旦点击开始按钮进入后台,然后从启动器进入程序,编译器调试就退出了。因为原来的程序已经终结了。其实我们可以这样。点击开始按钮进入后台后,回到编译器点击终止调试,然后再次启动启动。那么这样的话就可以到需要调试的断点了。毕竟这里的判断还是很多,容易出错。其实这个是利用的是Isolatedstorage的特点,模拟器不关闭这个Isolatedstorage的数据是不会丢失的。这节工程下载:http:/
27、 http:/ HYPERLINK 上一节完成后,程序已经能够正常运行了。基本功能都完成了。是不是有种很不出的感觉呢。大家都应该听说过会这个墓碑机制了吧。因为window phone 是单任务系统,为后台程序留了5个坑。程序一旦进入后台,就休眠了。被埋在坑里了,就不再运行了。只有你按返回键才能从进入休眠的后台程序。不过,我觉得还有两个问题,第一个就是如果程序在后台,你从启动器启动程序,就是不是按返回键进入程序,那么程序就重新运行了。原来后台的数据就没了,这个是一个用户体验很不好的地方,比如我,就是不喜欢按返回键进入程序的,喜欢从启动器进入后台程序。第二个,就是只有5个坑,一旦你的程序进入后台之
28、后,又有5个程序进入后台,那么你程序埋在坑里的尸体就被抛尸荒野了。再也不能从后台进入了,只能从启动器重新打开。那么,怎么解决呢,大家都是喜欢多任务运行的。我们就来模拟一把吧。模拟之前,先要了解程序的生命周期,这些大家还是百度吧。现在只是简单说下涉及到声明周期要使用到的函数。在App.xaml.cs里面定义了那么4个函数,Launching,Activate,Deactivate,Closing。Launching在程序启动的时候执行。Deactivate在用户点击开始键或者其他导致程序进入后台的操作时候执行,Activate在用户按返回键进入程序的时候执行。closing不用多说,看名字就知道
29、。在程序关闭的时候执行。在我们这个程序,也就在设置页面的时候如果中断运行进入后台的话才需要恢复,所以相对简单些。我的方案是:定义了两个变量,一个是保存当前所在页面的CurrentPage(保存到PhoneApplicationService),一个是保存是否中断到后台的Recovery。.在Deactivate函数里面保存需要的相关值和上面两个变量到Isolatedstorage。并且在Launching的时候把原来Deactivate保存的值取出来。然后再PageLoad 的时候判断是否是中断恢复。是的话就导航到相关页面,然后恢复界面值。恢复完成,Recovery设置为false,并且保存到
30、Isolatedstorage。在写代码之前,还要了解的是每个Page里面都有两个事件,OnNavigatedFrom和OnNavigatedTo,前者就是离开页面的时候执行,后者是进入页面的时候执行。重载这两个事件就能用了。下面先修改App.xaml.cs的代码:(代码中可能没添加命名空间,自己加吧,很简单)IsolatedStorageSettings iss = IsolatedStorageSettings.ApplicationSettings; private void Application_Launching(object sender, LaunchingEventArgs
31、e) /如果数据库不存在则创建一个数据库,并且存入相关数据 CreatDB(); l region 把Deactivate保存的相关数据取出来 string temp; if (iss.TryGetValue(LastPage, out temp) PhoneApplicationService.Current.StateCurrentPage = temp; int index; if (iss.TryGetValue(cityIndex, out index) PhoneApplicationService.Current.StatecityIndex = index; if (iss.T
32、ryGetValue(provIndex, out index) PhoneApplicationService.Current.StateprovIndex = index; #endregion private void Application_Deactivated(object sender, DeactivatedEventArgs e) #region 程序即将进入后台,保存中断情况的相关数据 issRecovery = true; if (PhoneApplicationService.Current.State.ContainsKey(cityIndex) isscityInd
33、ex = PhoneApplicationService.Current.StatecityIndex; if (PhoneApplicationService.Current.State.ContainsKey(provIndex) issprovIndex = PhoneApplicationService.Current.StateprovIndex; if (PhoneApplicationService.Current.State.ContainsKey(CurrentPage) issLastPage = PhoneApplicationService.Current.StateC
34、urrentPage; #endregion private void Application_Closing(object sender, ClosingEventArgs e) /退出, issRecovery = false; 下面修改MainPage的代码:(PageLoad修改如下)private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) #region 判断是否是中断进入 IsolatedStorageSettings iss = IsolatedStorageSettings.Applic
35、ationSettings; bool recov; if (iss.TryGetValue(Recovery, out recov) if (recov) if (PhoneApplicationService.Current.State.ContainsKey(CurrentPage) string temp = Convert.ToString(PhoneApplicationService.Current.StateCurrentPage); if (!temp.Equals(MainPage.xaml) & temp.Length 0) NavigationService.Navig
36、ate(new Uri(/WeatherForecast;component/ + temp, UriKind.Relative); else issRecovery = false; else PhoneApplicationService.Current.StateCurrentPage = MainPage.xaml; else PhoneApplicationService.Current.StateCurrentPage = MainPage.xaml; #endregion UpdateWeather(); 我们主要做的是SetPage的中断进入后台的处理,所以,要重载OnNavi
37、gatedFrom事件来保存两个Listpicker的SelectedIndex。而且,要在PageLoad的时候判断是否是中断返回,如果是那么就恢复。不是就常规绑定。下面是修改或者增加的代码: private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) #region 判定是否是中断退出后进入,是就恢复数据 IsolatedStorageSettings iss = IsolatedStorageSettings.ApplicationSettings; bool recov; if (iss.TryG
38、etValue(Recovery, out recov) if (recov) if (PhoneApplicationService.Current.State.ContainsKey(CurrentPage) string temp = Convert.ToString(PhoneApplicationService.Current.StateCurrentPage); if (temp.Equals(SetPage.xaml) int provIndex = 0; int cityIndex = 0; if (PhoneApplicationService.Current.State.C
39、ontainsKey(provIndex) provIndex = Convert.ToInt32(PhoneApplicationService.Current.StateprovIndex); if (PhoneApplicationService.Current.State.ContainsKey(cityIndex) cityIndex = Convert.ToInt32(PhoneApplicationService.Current.StatecityIndex); RecovListPickerItems(provIndex, cityIndex);/恢复数据 issRecover
40、y = false;/设置为已经恢复 else ProvLpDataBind(); else ProvLpDataBind(); else ProvLpDataBind(); else ProvLpDataBind(); #endregion PhoneApplicationService.Current.StateCurrentPage = SetPage.xaml; / / 恢复数据的时候绑定city的ItemSource,并且绑定两个ListPicker的当前选项 / / / void RecovListPickerItems(int provIndex, int cityIndex)
41、provincelp.ItemsSource = prov; if (provIndex = prov.Length) provIndex = 0; provincelp.SelectedIndex = provIndex; List l = cityDataBind(provprovIndex); if (cityIndex = l.Count() cityIndex = 0; citylp.SelectedIndex = cityIndex; / / 离开页面保存当前两个ListPicker的selectedIndex / / protected override void OnNavig
42、atedFrom(System.Windows.Navigation.NavigationEventArgs e) base.OnNavigatedFrom(e); PhoneApplicationService.Current.StateprovIndex = provincelp.SelectedIndex; PhoneApplicationService.Current.StatecityIndex = citylp.SelectedIndex; 这样,多任务模拟就完成了。无论是从返回键返回程序还是从启动器启动返回程序。都行。不过,如果要做的页面太多,控件太多还真是很麻烦的。PS:这里的
43、断点调试技巧:由于要测试从启动器恢复程序,但是编译器调试的时候,一旦点击开始按钮进入后台,然后从启动器进入程序,编译器调试就退出了。因为原来的程序已经终结了。其实我们可以这样。点击开始按钮进入后台后,回到编译器点击终止调试,然后再次启动启动。那么这样的话就可以到需要调试的断点了。毕竟这里的判断还是很多,容易出错。其实这个是利用的是Isolatedstorage的特点,模拟器不关闭这个Isolatedstorage的数据是不会丢失的。这节工程下载:http:/ http:/ (三)手把手教你写天气预报程序:运用WebClient获取天气和json数据解析 上一节我们练习了UserControl,
44、这次我们就要把UserControl运用到实际的布局上面来。 首先,把MainPage中的原来的测试UserControl的代码删除,在ContentPanel添加代码: 在设计框显示如下: 这样界面就这样吧。感觉也没啥好说的。现在看WebClient。在点击图中的右下角用红框选择的小按钮或者点击文档大纲。选择PhoneApplicationPage。选择好了。随意找个地点击一下,就成了图中的显示样子。然后选择属性 这里显示的是PhoneApplication的属性。如果不是。重新点击 然后在属性页面选择事件: 然后找到Loaded,在右边的框框双击,生成了一个PhoneApplication
45、Page_Loaded事件。编译器自动帮你导向了事件处理在这个Loaded事件中,我打算用WebClient获取天气信息。并且显示到界面上。获取天气,就要用到天气预报API。免费的API可以看我写的这个: HYPERLINK 上一节完成后,程序已经能够正常运行了。基本功能都完成了。是不是有种很不出的感觉呢。大家都应该听说过会这个墓碑机制了吧。因为window phone 是单任务系统,为后台程序留了5个坑。程序一旦进入后台,就休眠了。被埋在坑里了,就不再运行了。只有你按返回键才能从进入休眠的后台程序。不过,我觉得还有两个问题,第一个就是如果程序在后台,你从启动器启动程序,就是不是按返回键进入程
46、序,那么程序就重新运行了。原来后台的数据就没了,这个是一个用户体验很不好的地方,比如我,就是不喜欢按返回键进入程序的,喜欢从启动器进入后台程序。第二个,就是只有5个坑,一旦你的程序进入后台之后,又有5个程序进入后台,那么你程序埋在坑里的尸体就被抛尸荒野了。再也不能从后台进入了,只能从启动器重新打开。那么,怎么解决呢,大家都是喜欢多任务运行的。我们就来模拟一把吧。模拟之前,先要了解程序的生命周期,这些大家还是百度吧。现在只是简单说下涉及到声明周期要使用到的函数。在App.xaml.cs里面定义了那么4个函数,Launching,Activate,Deactivate,Closing。Launch
47、ing在程序启动的时候执行。Deactivate在用户点击开始键或者其他导致程序进入后台的操作时候执行,Activate在用户按返回键进入程序的时候执行。closing不用多说,看名字就知道。在程序关闭的时候执行。在我们这个程序,也就在设置页面的时候如果中断运行进入后台的话才需要恢复,所以相对简单些。我的方案是:定义了两个变量,一个是保存当前所在页面的CurrentPage(保存到PhoneApplicationService),一个是保存是否中断到后台的Recovery。.在Deactivate函数里面保存需要的相关值和上面两个变量到Isolatedstorage。并且在Launching的
48、时候把原来Deactivate保存的值取出来。然后再PageLoad 的时候判断是否是中断恢复。是的话就导航到相关页面,然后恢复界面值。恢复完成,Recovery设置为false,并且保存到Isolatedstorage。在写代码之前,还要了解的是每个Page里面都有两个事件,OnNavigatedFrom和OnNavigatedTo,前者就是离开页面的时候执行,后者是进入页面的时候执行。重载这两个事件就能用了。下面先修改App.xaml.cs的代码:(代码中可能没添加命名空间,自己加吧,很简单)IsolatedStorageSettings iss = IsolatedStorageSett
49、ings.ApplicationSettings; private void Application_Launching(object sender, LaunchingEventArgs e) /如果数据库不存在则创建一个数据库,并且存入相关数据 CreatDB(); l region 把Deactivate保存的相关数据取出来 string temp; if (iss.TryGetValue(LastPage, out temp) PhoneApplicationService.Current.StateCurrentPage = temp; int index; if (iss.TryG
50、etValue(cityIndex, out index) PhoneApplicationService.Current.StatecityIndex = index; if (iss.TryGetValue(provIndex, out index) PhoneApplicationService.Current.StateprovIndex = index; #endregion private void Application_Deactivated(object sender, DeactivatedEventArgs e) #region 程序即将进入后台,保存中断情况的相关数据
51、issRecovery = true; if (PhoneApplicationService.Current.State.ContainsKey(cityIndex) isscityIndex = PhoneApplicationService.Current.StatecityIndex; if (PhoneApplicationService.Current.State.ContainsKey(provIndex) issprovIndex = PhoneApplicationService.Current.StateprovIndex; if (PhoneApplicationServ
52、ice.Current.State.ContainsKey(CurrentPage) issLastPage = PhoneApplicationService.Current.StateCurrentPage; #endregion private void Application_Closing(object sender, ClosingEventArgs e) /退出, issRecovery = false; 下面修改MainPage的代码:(PageLoad修改如下)private void PhoneApplicationPage_Loaded(object sender, Ro
53、utedEventArgs e) #region 判断是否是中断进入 IsolatedStorageSettings iss = IsolatedStorageSettings.ApplicationSettings; bool recov; if (iss.TryGetValue(Recovery, out recov) if (recov) if (PhoneApplicationService.Current.State.ContainsKey(CurrentPage) string temp = Convert.ToString(PhoneApplicationService.Curr
54、ent.StateCurrentPage); if (!temp.Equals(MainPage.xaml) & temp.Length 0) NavigationService.Navigate(new Uri(/WeatherForecast;component/ + temp, UriKind.Relative); else issRecovery = false; else PhoneApplicationService.Current.StateCurrentPage = MainPage.xaml; else PhoneApplicationService.Current.Stat
55、eCurrentPage = MainPage.xaml; #endregion UpdateWeather(); 我们主要做的是SetPage的中断进入后台的处理,所以,要重载OnNavigatedFrom事件来保存两个Listpicker的SelectedIndex。而且,要在PageLoad的时候判断是否是中断返回,如果是那么就恢复。不是就常规绑定。下面是修改或者增加的代码: private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) #region 判定是否是中断退出后进入,是就恢复数据 Isol
56、atedStorageSettings iss = IsolatedStorageSettings.ApplicationSettings; bool recov; if (iss.TryGetValue(Recovery, out recov) if (recov) if (PhoneApplicationService.Current.State.ContainsKey(CurrentPage) string temp = Convert.ToString(PhoneApplicationService.Current.StateCurrentPage); if (temp.Equals(
57、SetPage.xaml) int provIndex = 0; int cityIndex = 0; if (PhoneApplicationService.Current.State.ContainsKey(provIndex) provIndex = Convert.ToInt32(PhoneApplicationService.Current.StateprovIndex); if (PhoneApplicationService.Current.State.ContainsKey(cityIndex) cityIndex = Convert.ToInt32(PhoneApplicat
58、ionService.Current.StatecityIndex); RecovListPickerItems(provIndex, cityIndex);/恢复数据 issRecovery = false;/设置为已经恢复 else ProvLpDataBind(); else ProvLpDataBind(); else ProvLpDataBind(); else ProvLpDataBind(); #endregion PhoneApplicationService.Current.StateCurrentPage = SetPage.xaml; / / 恢复数据的时候绑定city的
59、ItemSource,并且绑定两个ListPicker的当前选项 / / / void RecovListPickerItems(int provIndex, int cityIndex) provincelp.ItemsSource = prov; if (provIndex = prov.Length) provIndex = 0; provincelp.SelectedIndex = provIndex; List l = cityDataBind(provprovIndex); if (cityIndex = l.Count() cityIndex = 0; citylp.Select
60、edIndex = cityIndex; / / 离开页面保存当前两个ListPicker的selectedIndex / / protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) base.OnNavigatedFrom(e); PhoneApplicationService.Current.StateprovIndex = provincelp.SelectedIndex; PhoneApplicationService.Current.StatecityIndex
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 八年级数学下册 23.2 平行四边形(第2课时)(原卷版)
- 智能棋类机器人产业链解构:上游光学传感器与中游算法拆解
- 智能桌面香氛机赋能零售终端:提升进店率与停留时长策略
- 基于云计算的教育资源共享平台构建研究
- 智能助眠灯出海中东:高温环境下的散热难题与本土化营销策略
- 项目经理面试常见问题及应对策略
- 智能按摩靠垫出海拉美:新兴市场需求爆发与渠道变革
- 智能像素灯2.0时代:从单一照明到情感交互的范式跃迁
- 不再局限于医院肌电传感器在居家场景的降维打击与生态位争夺
- 港口岸电系统防雷接地电阻测试报告
- JG/T 491-2016建筑用网格式金属电缆桥架
- 《纳米技术与生活》课件
- 计算机网络安全技术保护措施
- 2023年铸钢件生产工序作业指导书
- 《电力建设安全工作规程 第2部分:电力线路》
- 安全隐患排查监理细则范文
- CJJT 268-2017 城镇燃气工程智能化技术规范
- 07FS02 防空地下室给排水设施安装
- 淮安和府项目PC构件吊装专项施工方案
- 工业自动化控制plc软著
- GB/T 33683-2017陆上石油物探测量与定位技术规范
评论
0/150
提交评论