将设置类添加到 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 的新类。 调用基类构造函数,指示是否要将设置存储在 LocalSettingsRoamingSettings 中。 添加调用基类成员的所有属性 SetGet 在 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>

所有内容都将正确存储在您的设置存储库中。

这里有 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 创建的存储库中下载带有功能示例的解决方案。

【讨论】:

以上是关于将设置类添加到 UWP 应用的主要内容,如果未能解决你的问题,请参考以下文章

如何将功能按钮添加到 UWP XAML 中的列表框项

将 CommandBar 添加到 xaml UWP 中当前歌曲列表的顶部。多次设置“内容”属性

如何将项目添加到 UWP 应用程序的资源管理器上下文菜单

如何将上下文菜单添加到 xamarin UWP 应用程序中的列表项?

从 StackPanel C# UWP 中选择图像(将动作侦听器添加到 UIElement 并将图像添加到 UIElement)

如何将 UWP 类库链接到 WPF 应用程序?