c# settings win-universal-app appsettings windows-10-universal

c# - Adición de la clase de configuración a una aplicación UWP



settings win-universal-app (1)

Estoy desarrollando una aplicación de plataforma universal de Windows pero no hay una plantilla de configuración en Visual Studio.

¿Cómo puedo implementar una clase fácil, fuertemente tipada y observable que almacene mis configuraciones en LocalSettings o RoamingSettings?


  1. Crear una nueva clase heredada de ObservableSettings.
  2. Llame al constructor de la clase base indicando si desea almacenar las configuraciones en LocalSettings o en RoamingSettings .
  3. Agregue todas sus propiedades llamando a los miembros de la clase base Establecer y obtener en el captador y en el configurador. ¡No es necesario pasar el nombre de la propiedad o usar el operador nameof () !
  4. Opcionalmente, puede establecer un valor predeterminado decorando la propiedad con el atributo DefaultSettingValue .

Aquí un ejemplo de una clase de configuración:

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); } } } }

y aquí cómo agregar una instancia en tu 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>

Acceda y modifique los valores de forma 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>

Todo se almacenará correctamente en su repositorio de configuración.

Aquí tiene la implementación de DefaultSettingValue y 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); }

Puede descargar una solución con un ejemplo funcional del repositorio que creé en GitHub .