zoukankan      html  css  js  c++  java
  • Windows Phone开发之路(18) 独立存储

      前面已经提到了,要想在程序多次运行间保存数据就必须使用独立存储。任何安装在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中,程序的墓碑化恢复操作的大部分任务都交给了程序自身来处理。但是最好是重写这两个方法,因为这样可以保证程序重新激活时能加载正确的页面。

  • 相关阅读:
    python基础练习5-9
    python安装
    python虚拟环境
    python基础语法--逻辑实现
    python基础语法
    IDE(vscode)
    pycharm使用
    复习
    环境搭建+python基础
    ASP.NET 5行代码搞二维码
  • 原文地址:https://www.cnblogs.com/mcgrady/p/2356521.html
Copyright © 2011-2022 走看看