前面已经提到了,要想在程序多次运行间保存数据就必须使用独立存储。任何安装在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 2012-02-18 10:41  永远的麦子  阅读(1699)  评论(1编辑  收藏  举报