2009-11-06 109 views
0

我的應用程序被分成一個配置工具,它可以寫入配置和一個只讀取和使用配置設置的查看器。在兩個應用程序之間共享配置的技巧?

在這種情況下,會推薦哪些存儲屬性的技術?不同類別的XML會是一個好主意嗎?

這些應用程序正在使用C#,.NET 3.5和WinForms進行開發。

回答

1

我會有一個共享程序集,其中包含您的設置類。然後,您可以序列化/反序列化這個類來一個共同的地方在硬盤上:然後

[XmlRoot()] 
public class Settings 
{ 
    private static Settings instance = new Settings(); 

    private Settings() {} 

    /// <summary> 
    /// Access the Singleton instance 
    /// </summary> 
    [XmlElement] 
    public static Settings Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 

    /// <summary> 
    /// Gets or sets the height. 
    /// </summary> 
    /// <value>The height.</value> 
    [XmlAttribute] 
    public int Height { get; set; } 

    /// <summary> 
    /// Main window status (Maximized or not) 
    /// </summary> 
    [XmlAttribute] 
    public FormWindowState WindowState 
    { 
     get; 
     set; 
    } 

    /// <summary> 
    /// Gets or sets a value indicating whether this <see cref="Settings"/> is offline. 
    /// </summary> 
    /// <value><c>true</c> if offline; otherwise, <c>false</c>.</value> 
    [XmlAttribute] 
    public bool IsSomething 
    { 
     get; 
     set; 
    } 

    /// <summary> 
    /// Save setting into file 
    /// </summary> 
    public static void Serialize() 
    { 
     // Create the directory 
     if (!Directory.Exists(AppTmpFolder)) 
     { 
      Directory.CreateDirectory(AppTmpFolder); 
     } 

     using (TextWriter writer = new StreamWriter(SettingsFilePath)) 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(Settings)); 
      serializer.Serialize(writer, Settings.Instance); 
     } 
    } 

    /// <summary> 
    /// Load setting from file 
    /// </summary> 
    public static void Deserialize() 
    { 
     if (!File.Exists(SettingsFilePath)) 
     { 
      // Can't find saved settings, using default vales 
      SetDefaults(); 
      return; 
     } 
     try 
     { 
      using (XmlReader reader = XmlReader.Create(SettingsFilePath)) 
      { 
       XmlSerializer serializer = new XmlSerializer(typeof(Settings)); 
       if (serializer.CanDeserialize(reader)) 
       { 
        Settings.instance = serializer.Deserialize(reader) as Settings; 
       } 
      } 
     } 
     catch (System.Exception) 
     { 
      // Failed to load some data, leave the settings to default 
      SetDefaults(); 
     } 
    } 
} 

XML文件看起來像這樣:

<?xml version="1.0" encoding="utf-8"?> 
<Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Height="738" WindowState="Maximized" IsSomething="false" > 
</Settings> 
+0

好主意,謝謝。 我該如何序列化與複選框的狀態? – Kai 2009-11-06 20:22:02

+0

添加一個布爾屬性IsFooChecked。加載表單時,調用Settings.Instance.Deserialize(),然後將控件的Checked屬性設置爲IsFooChecked。在OnFormClosing中,將IsFooChecked設置爲複選框的Checked屬性,然後調用Settings.Instance.Serialize()。 – 2009-11-06 20:40:30

+0

非常感謝,是否還有一種方法可以提高課程製作的準確性,而不是將所有屬性存儲在一個標籤中? – Kai 2009-11-06 21:42:30

1

XML似乎是這個的理想選擇。

在WinForms中,用戶設置通過XML持久保存,因此您擁有所有需要的類和輔助方法。

相關問題