将设置类添加到 UWP 应用
Posted
技术标签:
【中文标题】将设置类添加到 UWP 应用【英文标题】:Adding settings class to a UWP app 【发布时间】:2016-05-29 23:15:54 【问题描述】:我正在开发通用 Windows 平台应用,但 Visual Studio 中没有设置模板。
如何实现一个简单、强类型且可观察的类,将我的设置存储在 LocalSettings 或 RoamingSettings 中?
【问题讨论】:
meta.***.com/questions/317127/… 【参考方案1】:-
创建一个继承自 ObservableSettings 的新类。
调用基类构造函数,指示是否要将设置存储在 LocalSettings 或 RoamingSettings 中。
添加调用基类成员的所有属性
Set 和 Get 在 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 创建的存储库中下载带有功能示例的解决方案。
【讨论】:
以上是关于将设置类添加到 UWP 应用的主要内容,如果未能解决你的问题,请参考以下文章
将 CommandBar 添加到 xaml UWP 中当前歌曲列表的顶部。多次设置“内容”属性
如何将上下文菜单添加到 xamarin UWP 应用程序中的列表项?
从 StackPanel C# UWP 中选择图像(将动作侦听器添加到 UIElement 并将图像添加到 UIElement)