views:

168

answers:

3

I'm writing a WPF application with C# as the code behind and I want to give the users the option to change certain settings in my application. Is there a standard for storing settings within an application that will be read and written to constantly?

A: 

Despite the fact that the app.config file can be written to (using ConfigurationManager.OpenExeConfiguration to open for writing), the usual practice is to store read-only settings in there.

It's easy to write a simple settings class:

public sealed class Settings
{
    private readonly string _filename;
    private readonly XmlDocument _doc = new XmlDocument();

    private const string emptyFile =
        @"<?xml version=""1.0"" encoding=""utf-8"" ?>
          <configuration>
              <appSettings>
                  <add key=""defaultkey"" value=""123"" />
                  <add key=""anotherkey"" value=""abc"" />
              </appSettings>
          </configuration>";

    public Settings(string path, string filename)
    {
        // strip any trailing backslashes...
        while (path.Length > 0 && path.EndsWith("\\"))
        {
            path = path.Remove(path.Length - 1, 1);
        }

        _filename = Path.Combine(path, filename);

        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }

        if (!File.Exists(_filename))
        {
            // Create it...
            _doc.LoadXml(emptyFile);
            _doc.Save(_filename);
        }
        else
        {
            _doc.Load(_filename);
        }

    }

    /// <summary>
    /// Retrieve a value by name.
    /// Returns the supplied DefaultValue if not found.
    /// </summary>
    public string Get(string key, string defaultValue)
    {
        XmlNode node = _doc.SelectSingleNode("configuration/appSettings/add[@key='" + key + "']");

        if (node == null)
        {
            return defaultValue;
        }
        return node.Attributes["value"].Value ?? defaultValue;
    }

    /// <summary>
    /// Write a config value by key
    /// </summary>
    public void Set(string key, string value)
    {
        XmlNode node = _doc.SelectSingleNode("configuration/appSettings/add[@key='" + key + "']");

        if (node != null)
        {
            node.Attributes["value"].Value = value;

            _doc.Save(_filename);
        }
    }

}
Mitch Wheat
A: 

use ConfigurationSection class to store / retrieve settings from configuration file

see: How to: Create Custom Configuration Sections Using ConfigurationSection

public class ColorElement : ConfigurationElement
    {
        [ConfigurationProperty("background", DefaultValue = "FFFFFF", IsRequired = true)]
        [StringValidator(InvalidCharacters = "~!@#$%^&*()[]{}/;'\"|\\GHIJKLMNOPQRSTUVWXYZ", MinLength = 6, MaxLength = 6)]
        public String Background
        {
            get
            {
                return (String)this["background"];
            }
            set
            {
                this["background"] = value;
            }
        }
    }
Asad Butt
+1  A: 

You could try the window\page's Resources section on XAML.

Jojo Sardez