将设置类添加到UWP应用程序
我正在开发通用Windows平台应用程序,但在Visual Studio中没有设置模板。
我如何实现一个简单的,强types的和可观察的类,将我的设置存储在LocalSettings或RoamingSettings中?
- 创build一个从ObservableSettingsinheritance的新类。
- 调用基类构造函数,指示是否要将设置存储在LocalSettings或RoamingSettings中 。
- 添加所有调用基类成员的属性在getter和setter中设置和获取 。 无需传递该属性的名称或使用nameof()运算符!
- 或者,您可以使用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>
一切都将正确存储在您的设置库。
在这里你有DefaultSettingValue和ObservableSettings的实现:
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。