在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上用类��的方法绑定。