随笔 - 410  文章 - 0  评论 - 519  阅读 - 147万 

  前面已经提到了,要想在程序多次运行间保存数据就必须使用独立存储。任何安装在Windows Phone 7中的程序都可以访问自身的永久磁盘存储区域,这个区域称为独立存储。下面这个项目,将轻击的总数作为临时数据,也就是作为页面状态的一部分。将背景颜色作为应用程序设置被所有实例共享。

  MainPage.xaml XAML代码:

复制代码
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>

<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>

<TextBlock Text="屏幕被单击的次数为:"
Grid.Row="0"
Grid.Column="0"/>

<TextBlock Text=""
Name="txtNum"
Grid.Row="0"
Grid.Column="1"/>

</Grid>
复制代码

  MainPage.xaml C#代码:

复制代码
namespace SilverlightIsolatedStorage
{
public partial class MainPage : PhoneApplicationPage
{
//声明全局变量
Random rand = new Random();
int numTaps = 0;
PhoneApplicationService appService = PhoneApplicationService.Current;//获取当前应用程序的PhoneApplicationService对象,用于保存临时数据

//构造函数
public MainPage()
{
InitializeComponent();

UpdatenumTaps(numTaps);//初始化单击屏幕次数
Brush brush = (Application.Current as App).BackgroundBrush;//为使用独立存储设置访问App类

if (brush != null)
{
this.ContentPanel.Background = brush;//从App类中获取BackgroundBrush属性
}
}

protected void UpdatenumTaps(int num)//定义更新单击次数的方法
{
txtNum.Text = string.Format("{0}次",num);
}

protected override void OnManipulationStarted(ManipulationStartedEventArgs e)//重写基类Control(MainPage从它继承)的虚方法(当ManipulationStarted事件发生时调用)
{
//todo:单击屏幕时使背景颜色随机改变并将颜色保存到App类的公共属性中,然后调用UpdatenumTaps()方法使单击次数更新
SolidColorBrush brush = new SolidColorBrush(Color.FromArgb(255,(byte)rand.Next(256),(byte)rand.Next(256),(byte)rand.Next(256)));

this.ContentPanel.Background = brush;

(Application.Current as App).BackgroundBrush = brush;//为使用独立存储,保存数据到App类

UpdatenumTaps(++numTaps);//调用方法

e.Complete();
base.OnManipulationStarted(e);//调用基类虚方法
}

//虽然程序的墓碑化恢复操作的大部分任务留给了程序自身来处理,但是通过重写OnNavigatedFrom和OnNavigatedFrom方法可以保证程序重新激活并加载正确的页面
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)//重写基类Page的虚方法(当页面离开时调用)
{
//todo:保存临时数据到PhoneApplicationService的State字典中
appService.State["numTaps"] = numTaps;

base.OnNavigatedFrom(e);
}

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)//重写基类Page的虚方法(当页面成为框架的活动页面时调用)
{
//todo:加载numTaps
if (appService.State.ContainsKey("numTaps"))//判断是否包含该键
{
numTaps = (int)appService.State["numTaps"];
UpdatenumTaps(numTaps);
}

base.OnNavigatedTo(e);
}
}
}
复制代码

  效果如图:

     
           程序退出之前              程序退出后重新启动

  总结:1,如果是保存临时数据(一次执行周期之间的数据)最好使用PhoneApplicationService类保存;如果是保存应用程序设置(多次执行周期之间保存数据)最好使用独立存储IsolatedStorageSettings类保存。
     2,还有一个非常容易让人迷惑的问题?在没有重写OnNavigatedFrom和OnNavigatedTo方法的情况下,程序仍然能在墓碑化恢复的时候正确地显示上次单击屏幕的次数,这是因为在Windows Phone 7中,程序的墓碑化恢复操作的大部分任务都交给了程序自身来处理。但是最好是重写这两个方法,因为这样可以保证程序重新激活时能加载正确的页面。

posted on   永远的麦子  阅读(1703)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示