65.9K
CodeProject 正在变化。 阅读更多。
Home

AppSettings for Compact Framework 的实现

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.41/5 (25投票s)

2004 年 3 月 3 日

CPOL

1分钟阅读

viewsIcon

120915

downloadIcon

1073

学习如何创建一个设置类,以便轻松访问和存储您的应用程序设置。

Sample Image - SaveSettings.jpg

引言

.NET Compact Framework 不包含像完整框架那样的 AppSettings 类。在完整 .NET Framework 中,开发人员可以通过从 System.Configuration.ConfigurationSettings.AppSettings 类创建名称值集合来访问存储在 App.Config 文件中的设置。作为统一性的倡导者,我希望在紧凑框架上创建一些具有类似功能的工具。本文将展示我所做的。

使用代码

我的第一步是创建一个类似于 .NET 中的 App.Config 文件的 XML 文件。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="ServerIP" value="192.168.5.22" />
        <add key="UserName" value="testuser" />
        <add key="Password" value="jdhs822@@*" />
        <add key="PhoneNumber" value="5555555555" />
        <add key="TimeOut" value="60" />
        <add key="LastTransmit" value="03/03/2004 9:12:33 PM" />
        <add key="DatabasePath" value="\Program Files\DB\test.sdf" />
    </appSettings>
</configuration>

我将此文件命名为 Settings.xml,并将其添加到我的项目中,构建操作设置为“内容”。这确保了该文件将被下载到我的程序的执行文件夹中。

我的下一步是创建一个名为 Settings 的新类。该类仅包含静态成员,因此设置仅在程序执行期间从文件中访问一次,并且整个程序将可以轻松访问这些值。

我希望设置在访问设置时立即加载,因此我创建了一个静态构造函数,并将我的 XML 解析代码放在构造函数中。

m_settings 是一个 NameValueCollection,用于存储所有设置。

public class Settings
{
    private static NameValueCollection m_settings;
    private static string m_settingsPath;

    // Static Ctor
    static Settings()
    {
        // Get the path of the settings file.
        m_settingsPath = Path.GetDirectoryName(
        System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
        m_settingsPath += @"\Settings.xml";

        if(!File.Exists(m_settingsPath))
            throw new FileNotFoundException(
                              m_settingsPath + " could not be found.");

        System.Xml.XmlDocument xdoc = new XmlDocument();
        xdoc.Load(m_settingsPath);
        XmlElement root = xdoc.DocumentElement;
        System.Xml.XmlNodeList nodeList = root.ChildNodes.Item(0).ChildNodes;

        // Add settings to the NameValueCollection.
        m_settings = new NameValueCollection();
        m_settings.Add("ServerIP", nodeList.Item(0).Attributes["value"].Value);
        m_settings.Add("UserName", nodeList.Item(1).Attributes["value"].Value);
        m_settings.Add("Password", nodeList.Item(2).Attributes["value"].Value);
        m_settings.Add("PhoneNumber",
                                  nodeList.Item(3).Attributes["value"].Value);
        m_settings.Add("TimeOut", nodeList.Item(4).Attributes["value"].Value);
        m_settings.Add("LastTransmit",
                                  nodeList.Item(5).Attributes["value"].Value);
        m_settings.Add("DatabasePath",
                                  nodeList.Item(6).Attributes["value"].Value);
    }
}

现在,我们需要一些公共访问器来从 NameValueCollection 中检索值。

public static string ServerIP
{
    get { return m_settings.Get("ServerIP"); }
    set { m_settings.Set("ServerIP", value); }
}

public static string UserName
{
    get { return m_settings.Get("UserName"); }
    set { m_settings.Set("UserName", value); }
}

// ... And so on

剩下的唯一一件事是添加一个方法来更新我们的设置。XmlTextWriter 类为我们提供了一种轻量级的机制,用于将 xml 写入 FileStream。我们遍历 NameValueCollection 并以 xml 格式创建设置。

public static void Update()
{
    XmlTextWriter tw = new XmlTextWriter(m_settingsPath,
                                       System.Text.UTF8Encoding.UTF8);
    tw.WriteStartDocument();
    tw.WriteStartElement("configuration");
    tw.WriteStartElement("appSettings");

    for(int i=0; i<m_settings.Count; ++i)
    {
        tw.WriteStartElement("add");
        tw.WriteStartAttribute("key", string.Empty);
        tw.WriteRaw(m_settings.GetKey(i));
        tw.WriteEndAttribute();

        tw.WriteStartAttribute("value", string.Empty);
        tw.WriteRaw(m_settings.Get(i));
        tw.WriteEndAttribute();
        tw.WriteEndElement();
    }

    tw.WriteEndElement();
    tw.WriteEndElement();

    tw.Close();
}

现在我们可以从应用程序中的任何地方轻松访问我们的设置了!

© . All rights reserved.