在UWP里,保存和读取设置的方法和WinRT完全一致。用到的类是ApplicationData.Current.LocalSettings。它里面是用键值对保存设置的。

保存设置的方法是:

LocalSettings.Values[key] = value;

读取设置的方法是:

if (LocalSettings.Values.ContainsKey(key))
{
    return LocalSettings.Values[key];
}

注意得先判断key存不存在。

考虑到使用方便,我们可以封装一个管理应用程序设置的类型AppSettings:

public class AppSettings : INotifyPropertyChanged
{
    public bool ShowTimeSheetSetting
    {
        get
        {
            return ReadSettings(nameof(ShowTimeSheetSetting), true);
        }
        set
        {
            SaveSettings(nameof(ShowTimeSheetSetting), value);
            NotifyPropertyChanged();
        }
    }

    public ApplicationDataContainer LocalSettings { get; set; }

    public AppSettings()
    {
        LocalSettings = ApplicationData.Current.LocalSettings;
    }

    private void SaveSettings(string key, object value)
    {
        LocalSettings.Values[key] = value;
    }

    private T ReadSettings<T>(string key, T defaultValue)
    {
        if (LocalSettings.Values.ContainsKey(key))
        {
            return (T)LocalSettings.Values[key];
        }
        if (null != defaultValue)
        {
            return defaultValue;
        }
        return default(T);
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void NotifyPropertyChanged([CallerMemberName]string propName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
    }
}

主要几点:

1. 用C#6简化语法,key是string类型的,我们用nameof自动读取设置的属性名字。调用事件的时候,用?.判断事件是否为null。非常的有逼格。

2. 用到了泛型,做类型转换,如果有默认值,就返回默认值,因为通常我们的应用是需要设置的默认值的。这里我为了演示简单,只加了一个bool类型的ShowTimeSheetSetting属性。

3. 对外操作就是对属性的GET和SET,自动保存和读取设置,无需关心细节,也就是说ApplicationData.Current.LocalSetting 对外是透明的,意味着哪天具体的实现更改了,应用程序的其他地方可以不用动。这是一个设计上常用的原则。

4. 因为实现了INotifyPropertyChanged接口,在XAML上就可以做双向绑定了。于是就可以这样用:

<Page.Resources>
    <core:AppSettings x:Key="AppSettings" />
</Page.Resources>
<ToggleSwitch OnContent="显示首末班车时间" OffContent="隐藏首末班车时间" IsOn="{Binding Source={StaticResource AppSettings}, Path=ShowTimeSheetSetting, Mode=TwoWay}" />

其他类型的设置,比如string,int,都可以直接写成AppSettings类的属性,然后在xaml上用类似的方法绑定。