色選択ダイアログ(ColorDialog)の作成した色の保存

わんくまさんネタです。

ColorDialog クラスでは AllowFullOpen プロパティがデフォルトの True であれば、色の作成ボタンから基本色以外を選択すること、作成することができます。

image

ただし、何も実装しなければ、この ColorDialog クラスのインスタンスがなくなった時点で作成した色は失われます。

 

保存するためにはこの ColorDialog クラスの CustomColors プロパティから色を取り出して保存しておき、次回表示時に設定してあげる必要があります。

例:XmlSerializerやBinaryFormatterを使う

何も考えずに1ファイルにこの色情報だけを保存するのであれば、XmlSerializerやBinaryFormatterを使えばそれで終わります。

XmlSerializerの例

private void LoadCustomColors(string filePath, ColorDialog targetColorDialog)
{
    using (var stream = new FileStream(filePath, FileMode.Open))
    {
        var xmlSerializer = new XmlSerializer(typeof(int[]));
        targetColorDialog.CustomColors = (int[])xmlSerializer.Deserialize(stream);
    }
} private void SaveCustomColors(string filePath, ColorDialog sourceColorDialog) {
    using (var stream = new FileStream(filePath, FileMode.Create))
    {
        var xmlSerializer = new XmlSerializer(typeof(int[]));
        xmlSerializer.Serialize(stream, sourceColorDialog.CustomColors);
    }
}

BinaryFormatterの例

private void LoadCustomColors(string filePath, ColorDialog targetColorDialog)
{
    using (var stream = new FileStream(filePath, FileMode.Open))
    {
        var formatter = new BinaryFormatter();
        targetColorDialog.CustomColors = (int[])formatter.Deserialize(stream);
    }
} private void SaveCustomColors(string filePath, ColorDialog sourceColorDialog)
{
    using (var stream = new FileStream(filePath, FileMode.Create))
    {
        var formatter = new BinaryFormatter();
        formatter.Serialize(stream, sourceColorDialog.CustomColors);
    }
}

 

これらのサンプルメソッドの内、LoadCustomColors メソッドは Form の Load イベント(やコンストラクタ)、ダイアログの表示直前といったタイミングで呼び出してください。

LoadCustomColors(@"(ファイル名)", colorDialog1);

SaveCustomColors メソッドは Form の FormClosed イベントなどで呼び出してください。

SaveCustomColors(@"(ファイル名)", colorDialog1);

プロジェクトの設定(Properties.Settings)に保存したい

先の例はお手軽なものの、1ファイルに1つの情報だけを保存するのは微妙なので、もう一例紹介しておきます。

設定の構造にはデフォルトで int[] を扱える型がないので文字列で扱う例です。

あらかじめ、プロジェクトのプロパティの設定タブから ColorSettings という文字列型の設定値を「ユーザー」スコープで追加しておいてください。

image

以下は int 型配列を文字列に変えて、「,(カンマ)」区切りで連結しています。

private void LoadCustomColors(ColorDialog targetColorDialog)
{
    targetColorDialog.CustomColors =
        Properties.Settings.Default.ColorSettings.Split(new[] {','}, 16).Select(int.Parse).ToArray();
} private void SaveCustomColors(ColorDialog sourceColorDialog) {
    Properties.Settings.Default.ColorSettings = string.Join(",", sourceColorDialog.CustomColors);
    Properties.Settings.Default.Save();
}

こちらのサンプルメソッドは、LoadCustomColors メソッドを Form の Load イベントで呼び出す、SaveCustomColors メソッドを Form の FormClosed イベントで呼び出すといった想定です。

LoadCustomColors(colorDialog1);
SaveCustomColors(colorDialog1);

メソッドを分けずに、それらのイベントハンドラに直接中身を書く形でも良いでしょう。