アプリケーションに設定機能を付けるクラスの雛形。簡単なUIも提供する。
using System; using System.ComponentModel; using System.IO; using System.Windows.Forms; using System.Xml.Serialization; public class Settings { private static readonly string settingFile = Application.StartupPath + "\\Settings.xml"; //設定を保存する場所を指定。 private static Settings instance; private static bool loading = false; /// <summary> /// セッティングが変更されると発生 /// </summary> public static event EventHandler SettingsChange; //シングルトン private Settings() { } //コンストラクタに引数があるとシリアライズ出来ない。 /// <summary> /// アプリケーションのセッティングを取得 /// </summary> public static Settings Instance { get { if(instance == null) { loading = true; try { XmlSerializer xs = new XmlSerializer(typeof(Settings)); using(StreamReader sr = new StreamReader(settingFile)) { instance = ((Settings)(xs.Deserialize(sr))); sr.Close(); } } catch { instance = new Settings(); } loading = false; } return instance; } } /// <summary> /// 設定の編集フォームを開く /// </summary> public static void OpenSettingsForm() { SettingsForm.Instance.Show(); SettingsForm.Instance.Activate(); } private double opacity = 0.7; // //[Browsable(false)] //これを指定すると設定フォームに表示されなくなる // [Category("カテゴリー"), Description("説明")] // public double Opacity { //publicにしないとシリアライズされない // set { // double preChangeValue = opacity; // opacity = value; //これを用意したい設定の分だけ書き加える。 if(preChangeValue != value && !loading && SettingsChange != null) { // SettingsChange(instance, new EventArgs()); //変更されたら必ず呼び出す。// } // } // get { // return opacity; // } // } // /// <summary> /// セッティングをファイルに保存する /// </summary> public static void Save() { XmlSerializer xs = new XmlSerializer(typeof(Settings)); using(StreamWriter sw = new StreamWriter(settingFile)) { xs.Serialize(sw, Settings.Instance); sw.Close(); } } private class SettingsForm :Form { private static SettingsForm instance; private PropertyGrid propertyGrid = new PropertyGrid(); //ここでフォームの装飾等をするといいかも。 private SettingsForm() { this.Text = "設定フォーム"; this.propertyGrid.Dock = DockStyle.Fill; this.Controls.Add(this.propertyGrid); this.propertyGrid.SelectedObject = Settings.Instance; Settings.SettingsChange += new EventHandler(reLoad); } public static SettingsForm Instance { get { if(instance == null || !instance.Created) instance = new SettingsForm(); return instance; } } public static void ReLoad() { SettingsForm.Instance.reLoad(null,null); } private void reLoad(object sender,EventArgs e) { this.propertyGrid.RefreshTabs(PropertyTabScope.Component); this.propertyGrid.Refresh(); } ~SettingsForm() { SettingsChange -= new EventHandler(reLoad); } } }
このクラスは次の様に使用する。
using System; using System.Windows.Forms; public partial class Form1 :Form { public Form1() { InitializeComponent(); this.Opacity = Settings.Instance.Opacity; Settings.SettingsChange += new EventHandler(Settings_SettingsChange); } private void button1_Click(object sender, EventArgs e) { Settings.OpenSettingsForm(); } void Settings_SettingsChange(object sender, EventArgs e) { this.Opacity = ((Settings)sender).Opacity; } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { Settings.Save(); } }