将设置类添加到UWP应用 [英] Adding settings class to a UWP app

查看:71
本文介绍了将设置类添加到UWP应用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm developing a Universal Windows Platform app but there is no Settings template in Visual Studio.

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

How can I implement an easy, strongly typed and observable class that stores my settings in LocalSettings or RoamingSettings?

推荐答案

  1. 创建一个继承自ObservableSettings的新类.
  2. 调用基类构造函数,以指示是否要将设置存储在 LocalSettings RoamingSettings 中.
  3. 添加所有调用基类成员的属性 在getter和setter中设置获取.无需传递属性名称或使用 nameof()运算符!
  4. (可选)您可以设置一个默认值,以使用 DefaultSettingValue 属性装饰该属性.
  1. Create a new class inheriting from ObservableSettings.
  2. Call to the base class constructor indicating if you want to store the settings in LocalSettings or in RoamingSettings.
  3. Add all your properties calling the base class members Set and Get in the getter and in the setter. No need to pass the name of the property or use nameof() operator!
  4. Optionally you can set a default value decorating the property with DefaultSettingValue attribute.

以下是设置类的示例:

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中添加实例:

and here how to add an instance in your 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方式访问和修改值:

Access and modify the values in a MVVM fashion:

<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>

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

Everything will be stored properly in your settings repository.

在这里,您已经实现了 DefaultSettingValue ObservableSettings :

Here you have the implementation of DefaultSettingValue and 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 中创建的存储库中下载带有功能示例的解决方案.

You can download a solution with a functional example from the repository I created in GitHub.

这篇关于将设置类添加到UWP应用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆