将设置类添加到UWP应用程序

我正在开发通用Windows平台应用程序,但在Visual Studio中没有设置模板。

我如何实现一个简单的,强types的和可观察的类,将我的设置存储在LocalSettings或RoamingSettings中?

  1. 创build一个从ObservableSettingsinheritance的新类。
  2. 调用基类构造函数,指示是否要将设置存储在LocalSettingsRoamingSettings中
  3. 添加所有调用基类成员的属性在getter和setter中设置获取 。 无需传递该属性的名称或使用nameof()运算符!
  4. 或者,您可以使用DefaultSettingValue属性设置装饰属性的默认值。

这里有一个设置类的例子:

namespace Test { public class Settings : ObservableSettings { private static Settings settings = new Settings(); public static Settings Default { get { return settings; } } public Settings() : base(ApplicationData.Current.LocalSettings) { } [DefaultSettingValue(Value = 115200)] public int Bauds { get { return Get<int>(); } set { Set(value); } } [DefaultSettingValue(Value = "Jose")] public string Name { get { return Get<string>(); } set { Set(value); } } } } 

在这里如何添加一个实例在你的app.xaml:

 <Application x:Class="Test.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Test" RequestedTheme="Light"> <Application.Resources> <local:Settings x:Key="settings"/> </Application.Resources> </Application> 

以MVVM方式访问和修改值:

 <Page x:Class="Test.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Test" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" DataContext="{StaticResource settings}"> <StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <TextBlock Text="Bauds"/> <TextBox Text="{Binding Default.Bauds, Mode=TwoWay}"/> <TextBlock Text="Name"/> <TextBox Text="{Binding Default.Name, Mode=TwoWay}"/> </StackPanel> </Page> 

一切都将正确存储在您的设置库。

在这里你有DefaultSettingValueObservableSettings的实现:

 using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using System.Reflection; using System.ComponentModel; using Windows.Storage; [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] public sealed class DefaultSettingValueAttribute : Attribute { public DefaultSettingValueAttribute() { } public DefaultSettingValueAttribute(object value) { Value = value; } public object Value { get; set; } } public class ObservableSettings : INotifyPropertyChanged { private readonly ApplicationDataContainer settings; public ObservableSettings(ApplicationDataContainer settings) { this.settings = settings; } public event PropertyChangedEventHandler PropertyChanged; protected bool Set<T>(T value, [CallerMemberName] string propertyName = null) { if (settings.Values.ContainsKey(propertyName)) { var currentValue = (T)settings.Values[propertyName]; if (EqualityComparer<T>.Default.Equals(currentValue, value)) return false; } settings.Values[propertyName] = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); return true; } protected T Get<T>([CallerMemberName] string propertyName = null) { if (settings.Values.ContainsKey(propertyName)) return (T)settings.Values[propertyName]; var attributes = GetType().GetTypeInfo().GetDeclaredProperty(propertyName).CustomAttributes.Where(ca => ca.AttributeType == typeof(DefaultSettingValueAttribute)).ToList(); if (attributes.Count == 1) return (T)attributes[0].NamedArguments[0].TypedValue.Value; return default(T); } 

您可以从我在GitHub中创build的存储库中下载一个具有function示例的解决scheme。