none
BackgroundImageプロパティのShouldSerializeとReset RRS feed

  • 質問

  • OS環境:Windows 7 64ビット
    開発環境:Visual Studio 2010 (.NET Framework 4.0)
    アプリケーション:Windowsアプリケーション

    上記条件で開発していますが、カスタムのボタンコントロールの改変に関して悩んでおります。

    当初はこのコントロール、そのサイズもコントロールのバックグランドイメージも固定という仕様になっておりましたが
    今回、サイズやバックグランドイメージを可変(イメージ無しのケースもあり)にするということになってしまいました。

    可変にすることそのものは問題ありませんが、そのカスタムコントロールは既存の開発ですでに利用されており、デザイナを含む既存のコードに変更が発生しないことという条件がついております。

    サイズに関しては問題なく実装できたのですが、困っているのはバックグランドイメージの方です。

    これら既定のバックグランドイメージは初期値という形で設定され、変更が加えられるとその値をデザイナで生成するという下記のような仕様です。

    ・イメージが既定のままの場合、デザイナはコードを生成しない
    ・イメージを削除して「(なし)」にした際にデザイナで下記のようなコードを生成する
     customButton.BackgoundImage = null;
    ・イメージを既定のもの以外に設定した場合、コードを生成する

    という動作をさせたいと考え、以下のように実装しましたが、ResetBackgroundImageもShouldSerializeBackgroundImageも
    呼出されていないようです。
    デザイナから「リセット」してやると「(なし)」になりますし、バックグランドイメージを削除しても強調表示にはならず、デザイナにもコードが生成されない。

    public override Image BackgroundImage { get { return base.BackgroundImage; } set { base.BackgroundImage = value; } }

    public void ResetBackgroundImage()
    {
        BackgroundImage = (Image)Resources.image1;
    }

    public bool ShouldSerializeBackgroundImage()
    {
        return (BackgroundImage != (Image)Resources.image1);
    }

    ネットでDefaultValueやShouldSerializeBackgroundImageなどをキーワードにぐぐっても見たのですが、うまくヒットしませんでした。

    BackgroundImageの場合はReset***やShouldSerialize***は利用することができないのでしょうか。

    どなたか、ご存知の方がいらっしゃいましたら、情報を提供していただけると助かります。

    ちなみに
    カスタムコントロールと、作成中のフォームとは別アセンブリのため、フォーム側からは既定のバックグランドイメージを直接参照することはできません。

    2013年7月8日 5:39

回答

すべての返信

  • 失礼します。もしかして Control.BackgroundImage プロパティに DefaultValueAttribute が設定されているため、ShouldSerialize メソッドと Reset メソッドがうまく機能しないのではないでしょうか。

    • 回答の候補に設定 星 睦美 2013年7月22日 1:06
    2013年7月18日 13:57
  • ありがとうございます。レスがつかないのかなと半ばあきらめてました。

    失礼します。もしかして Control.BackgroundImage プロパティに DefaultValueAttribute が設定されているため、ShouldSerialize メソッドと Reset メソッドがうまく機能しないのではないでしょうか。

    その可能性が高いのかなと思っています。

    でも、ニーズとしては通常はあるBackgroundImage で、必要に応じて異なるイメージにしたり、イメージを使わなかったりなどの選択ができれば助かるんですけど...。

    余りやりたくなかったのですが、Textプロパティが設定されたタイミングでBackgroundImage を消すようにして、小手先的には解決はしたのですが、なんともすっきりしない気持ちです。

    2013年7月19日 9:44
  • US のフォーラムでも似たような問答があったようです。

    DefaultValue ShouldSerializeXXX inheritance problem.
    http://social.msdn.microsoft.com/forums/wpapps/ja-jp/49a5cefc-b290-46c0-a474-a30237501da3/defaultvalue-shouldserializexxx-inheritance-problem

    残念ながら「It seems that it is not easy to serialize ".Image = null" into designer code. I think you might try to avoid set Image property in the constructor.」というコメントがついているので、ご期待に添えるものではありませんが…。

    2013年7月19日 14:48
    モデレータ
  • US のフォーラムでも似たような問答があったようです。

    DefaultValue ShouldSerializeXXX inheritance problem.
    http://social.msdn.microsoft.com/forums/wpapps/ja-jp/49a5cefc-b290-46c0-a474-a30237501da3/defaultvalue-shouldserializexxx-inheritance-problem

    残念ながら「It seems that it is not easy to serialize ".Image = null" into designer code. I think you might try to avoid set Image property in the constructor.」というコメントがついているので、ご期待に添えるものではありませんが…。

    なるほど、継承元にすでにDefaultValueが設定されていると継承先のクラスではShouldSerializeXXXは使えないのですね。

    継承先のクラス内で両方同時に設定されていると動作しないとばかり思い込んでドツボにはまり込んでおりました。

    よーく考えると理解できるのですが、はまっている時は冷静ではないのですね。

    ありがとうございました。

    2013年7月22日 10:03