たこぜりー研究室

大腸菌DNAは4.64Mbp。酵母は13Mbpで、ヒトは3Gbp

スポンサーサイト

#
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Control.BackColor プロパティ

#214
[Proposition]
Control の派生クラスで、Control.BackColor プロパティの既定値を変更する方法

[Study]
例えば ListViewTextBoxBase では、背景色は本来の "Control" のシステムカラーから、"Window" のシステムカラーに変更されている。
実際、それらの BackColor プロパティはオーバーライドされている。

[Examination]
システムカラーは System.Drawing.SystemColors クラスで定義されている。

private static new Color DefaultBackColor = SystemColors.Windows;

最初はこのようにしてみたが、上手くいかず、やはり BackColor プロパティのオーバーライドが必要であるようだ。

[DefaultProperty(SystemColors.Window)]

だがこれではエラーが発生する。なぜならば、「属性引数は、定数式、typeof 式、または配列の作成式でなければならない」からである。
SystemColors.Window プロパティは静的プロパティであって、列挙値ではない。
なので、

[DefaultProperty(typeof(Color), "SystemColors.Window")]

としてみた。エラーは発生しないが、既定値としてうまく設定できていない。
なので、逆に SystemColors.Window.ToString() を見てみると、出力は "Color [Window]" となる。
しかし、そのままではやっぱり上手くいかず、実際 System.Drawing.ColorConverter.ConvertFromString メソッドを使ってみると、例外が発生する。
結局 "Window" とするだけで上手くいくことが判明した。

[Conclusion]
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

...

[DefaultProperty(typeof(Color), "Window")]
public override Color BackColor
{
  get { return base.BackColor; }
  set { base.BackColor = value; }
}

・既定値の設定には、System.ComponentModel.DefaultPropertyAttribute を使う。
・属性引数は、定数式、typeof 式、または配列の作成式でなければならない。
 typeof 式の場合、その指定した型の TypeConverter が使われる。

コメント


コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURL:  http://takojelly.blog2.fc2.com/tb.php/214-04a952f0
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。