C#
WPF
VisualStudio

WPF Settingsを楽に使う方法を考えてみた


Settingsとは

アプリケーションの状態とか各種設定値とかを保存できる機能

ウィンドウの位置・サイズを記憶させて次回起動時に復元とかよくやると思う

使い方自体は簡単なので参考を見ればわかると思う

参考:プログラマーズ雑記帳/Settings を使った WPF でのアプリケーション設定の保存 (ウィンドウの表示位置、サイズの保存

ここではなるべく簡単にSettingsを使う方法を考えてみる(ΦωΦ)


1.普通に使う


MainWindow.xaml.cs

private void MainWindow_Load(object sender, EventArgs e)

{
//読み込み
}
private void MainWindow_FormClosing(object sender, FormClosingEventArgs e)
{
//保存
}

こんな感じでWindowを読み込んだ時閉じる時に処理を書く

これだと設定項目が増えればいちいち書き足す必要がある上、他のタイミングで保存とかしたい時に

また長々と設定項目毎にコードを書かないといけなくなる┐(´д`)┌

Viewが一つで、設定の読み込み・保存のタイミングが固定ならこれでもいいと思う


2.処理部分をメソッドにする

private Settings settings = Settings;

public void LoadSettings()
{
//読み込み
}
public void SaveSettings()
{
//保存
}

これなら項目が増えてもメソッドに書き足すだけで済む

しかし、これだとViewが増える度に同じようにメソッドを書かないといけなくなる(ヽ´ω`)


3.Helperクラスを作る

Settingsへの保存処理などが汎用的にできるクラスを作ればもっと楽になりそう

例えば

public class SettingsHelper

{
private ApplicationSettingsBase settings;

public SettingsHelper(ApplicationSettingsBase defaultSettings)
{
this.settings = defaultSettings;
}

public void SaveSettings(Action<ApplicationSettingsBase> action)
{
action.Invoke(this.settings);
this.settings.Save();
}
}

こんな感じのクラスを作れば、保存時の値の設定が

public class Sample

{
public void Save()
{
var helper = new SettingsHelper(settings);
helper.SaveSettings(s =>
{
s["hoge"] = "hogehoge";
s["piyo"] = "piyopiyo";
});
}
}

こんな感じに書けるようになる

ただこれだと、インデクサでないとプロパティの指定ができないので、ジェネリックで使いやすくしたものを作った


使い方

SettingsHelper<T>をインスタンス化してメソッドを使うだけ

<T>はApplicationSettingsBaseを継承している必要がある

コンストラクタには<T>型のSettingsインスタンスを指定する

指定しなければ自動的にリフレクションで<T>内のDefaultプロパティを探してSettingsとする

(VisualStudioの

追加>新しい項目>設定ファイル

で追加したものにはデフォルトで記述されている)

Settings自体はstaticとしてキャッシュしているため、あちこちでインスタンス化してもリフレクションで重くなりづらいようにしたつもり

使う際にインスタンス化してもいいが、SettingsHelper<T>のインスタンスを提供するクラスを作るなどしたほうが使いやすいと思う

簡単なサンプルも置いておく


終わりに

Settingsをなるべく楽に使うためにいろいろ考えたらこうなった・ω・

ここのやり方がおかしい・もっといいやり方がある

などなどあれば教えて下さい(人∀・)