日期:2014-05-17  浏览次数:20694 次

新时尚Windows8开发(4):保存/读取本地应用程序设置

启动VS,打开“对象浏览器”,我们来找一个东西。

在“对象浏览器”中找到Windows.Storage命名空间,并注意以下几个类。

其中,我们要注意ApplicationData,看看它这名字,你也能猜到它是干哪行的。很明显,它一定与读写应用程序设置有关。

嗯,猜得没错,ApplicationData有一个静态属性——Current,不用多解释,指的自然是我们当前运行的应用程序。因此,我们就知道,要得到当前应用程序的ApplicationData,就通过该属性。

好的,第一个问题解决,现在看第二个问题:如何保存应用程序设置?如何读取?其实这是一个问题,知道了如何保存,自然就知道如何读取了。

再看看LocalSettings属性,它返回一个ApplicationDataContainer类的实例,这是一个容器,而且,一个应用程序的本地设置中,还可以包括N个容器,但每个应用程序也会带有一个容器,所以,如果我们只是存取简单的设置,不需要创建容器,就利用默认的设置容器即可。

ApplicationDataContainer类有个Values属性,它返回一个IPropertySet接口,侈顺着“对象浏览器”就能找到,它其实就是一个字典(Key - Value),所以说,“对象浏览器”非常有用,把它用好了,能为我们解决许多问题。

 

我相信,如果你的编程基础修练得扎实的话,你不用往下看了,现在,你已经知道如何读写应用程序设置信息了。

应用程序设置用来干吗?呵呵,这个不难理解,比如,我们的应用程序会提供一个“设置”页面,让用户按照他的习惯进行设置,如用户选择了哪一套皮肤,或者他设置某页面的数据,默认显示15条还是30条。

设置信息是比较简单的数据,所以,我们就保存到本地设置中即可。

 

还有,上面提到了设置信息有容器,这个嘛,可以认为将设置信息分组,就像我们在设置存储区建立了文件夹一样。

也可以联想一个注册表,Windows系统的注册表其实就是一个庞大的字典,它有键,每个键对应一个值,但我们知道,注册表是分组的,就像我们硬盘中保存的文件夹和文件一样。

比如,注册表的根会分为HKEY_CURRENT_USER,HKEY_LOCAL_MACHINE等等。

 

下面,我们一起来做一个练习,这样我们不只是停留在理论上,动手操作一下吧。

1、启动VS,新建一个项(此处省略39个字)。

2、打开MainPage.xaml,参考下面XAML代码:

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="2*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Column="0" Margin="20" TextWrapping="Wrap">
            <Span FontSize="36" Foreground="Pink" FontWeight="Black">示例说明</Span>
            <LineBreak/>
            <Run FontSize="24">
                在右侧的列表中选择一项,然后挂起或退出应用程序;接着再运行应用程序。
            </Run>
            <LineBreak/>
            <Run FontSize="24">
                在作出选择后,将选择项的索引保存到设置中,当页面初始化时,从设置中读入之前选择列表项的索引。
            </Run>
        </TextBlock>
        <ListBox x:Name="MyListBox" FontSize="28" SelectionChanged="onSelectedChanged" Grid.Column="1">
            <ListBoxItem>项目一</ListBoxItem>
            <ListBoxItem>项目二</ListBoxItem>
            <ListBoxItem>项目三</ListBoxItem>
            <ListBoxItem>项目四</ListBoxItem>
            <ListBoxItem>项目五</ListBoxItem>
        </ListBox>
    </Grid>


我相信不难理解,重点是ListBox,我们在其中随意设置几个项目,并绑定其SelectionChanged事件。

3、在SelectionChanged事件上右击,从弹出的菜单中选择“定位到事件处理程序”,这时候就转到后台代码文件了。

4、我比较习惯用C#,所以,下面代码为C#代码。

        private void onSelectedChanged(object sender, SelectionChangedEventArgs e)
        {
            ListBox lb = sender as ListBox;
            if (lb != null)
            {
                if (lb.SelectedIndex > -1)
                {
                    ApplicationDataContainer myContainer = ApplicationData.Current.LocalSettings;
                    myContainer.Values["index"] = lb.SelectedIndex;
                }
            }
        }

代码是不复杂的,重点我们是看一下如何保存设置。这里,我们把当前选定项的索引保存。

5、当应用程序导航到本页面时,我们就从设置中读出刚才保存的索引,并把ListBox的选定项索引还原。

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            ApplicationDataContainer container = ApplicationData.Current.LocalSettings;
            if (container.Values.ContainsKey("index"))
            {
                this.MyListBox.SelectedIndex = (int)container.Values["index"];
            }
            else
            {
                this.MyListBox.SelectedIndex = 0;
            }
        }

在读出设置前,一定要通过ContainsKey方法判断一下