40

मैं एक सार्वभौमिक विंडोज प्लेटफ़ॉर्म ऐप विकसित कर रहा हूं लेकिन विजुअल स्टूडियो में कोई सेटिंग टेम्पलेट नहीं है।एक यूडब्ल्यूपी ऐप में सेटिंग्स वर्ग जोड़ना

मैं एक आसान, दृढ़ता से टाइप और अवलोकन योग्य कक्षा को कैसे कार्यान्वित कर सकता हूं जो स्थानीय सेटिंग्स या रोमिंग सेटिंग में मेरी सेटिंग्स को संग्रहीत करता है?

+13

http://meta.stackoverflow.com/questions/317127/hidden-advertisement-as-spam –

उत्तर

51
  1. ऑब्जर्वेबल सेटिंग्स से विरासत में एक नई कक्षा बनाएं।
  2. बेस क्लास कन्स्ट्रक्टर को कॉल करें, यह इंगित करता है कि क्या आप स्थानीय सेटिंग्स या रोमिंग सेटिंग्स में सेटिंग्स को स्टोर करना चाहते हैं।
  3. अपने सभी गुण आधार वर्ग के सदस्यों को बुला सेट और गेटर में और सेटर में जाओ जोड़ें। संपत्ति का नाम पास करने या नाम() ऑपरेटर का उपयोग करने की आवश्यकता नहीं है!
  4. वैकल्पिक रूप से आप डिफ़ॉल्टसेटिंग वैल्यू विशेषता के साथ संपत्ति को सजाने वाला डिफ़ॉल्ट मान सेट कर सकते हैं।
यहाँ

एक सेटिंग वर्ग का एक उदाहरण:

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> 

सबकुछ ठीक से आपके एस में संग्रहीत किया जाएगा ettings भंडार।

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 में बनाया से एक कार्यात्मक उदाहरण के साथ एक समाधान डाउनलोड कर सकते हैं:

यहाँ आप DefaultSettingValue और ObservableSettings के कार्यान्वयन की है।

+17

अच्छा स्व-उत्तर! एसओ में योगदान के लिए धन्यवाद। किसी ब्लॉग या अपनी खुद की परियोजना (या आपकी कंपनी, ...) से लिंक करते समय, आपको एक छोटे से अस्वीकरण (या तो उत्तर के शीर्ष पर या लिंक के नजदीक) जोड़ने के लिए प्रोत्साहित किया जाता है, जैसा कि कहा गया प्रोजेक्ट के साथ आपका संबंध निर्दिष्ट करता है, यह आपकी निष्पक्षता को प्रभावित कर सकता है। –

संबंधित मुद्दे