属性でVisual Studioにヒントを与える
C#にもVB.NETにも、「属性」というものがあります。属性は、言語を拡張することなく、付加情報を加えることを可能にする機能です。この付加情報は、コンパイラ-、Visual StudioなどのIDE、その他各種ツールが参照することができます。
例えば、WinAPIなどを呼び出したことがある方は、[DllImport(“user32.dll”)]のような記述をしたことがありますよね。また例えば大きなプロジェクトでは、[obsolete]という、「このメソッドの内容は古いのでもう使わないで」という意味の属性を使ったことがあるかもしれません。
属性もクラスで実装されているので、ユーザー定義の属性を作ることもできます。
上のような特徴がある属性ですが、今私たちが関心があるのはカスタムコントロールです。そして、カスタムコントロールに関係のある属性はたくさんあります。
中級編ではこの、「カスタムコントロールに関係のある属性とそれに付随するコード」を主体にして進めていきます。「関係」とはどのようなものかというと、Visual Studioにヒントを与えて、プロパティウィンドウで、標準のプロパティなどと同じような動作をさせるというものです。
さてそれでは早速、はじめの属性を使ってみましょう。なお、サンプルとして、初級編で扱った影付き文字列を表示するコントロールを使います。ShadowColorとShadowDepthという2つのプロパティが追加されたコントロールですでしたね。
初級編では、この2つのプロパティを公開するところまで行きました。しかし、気づいた方もいるかもしれませんが、これらのプロパティは、プロパティウィンドウで項目順に並べると、「その他」というカテゴリーに入ってしまっています。また、カーソルをそのプロパティの上に持って行っても、プロパティウィンドウの最下部に説明文は表示されません。
そこで登場するのが属性です。
[Category("表示")] [Description("テキストの影の色です。")] public Color ShadowColor { get { return _shadowColor; } set { _shadowColor = value; Invalidate(); } } [Category("表示")] [Description("テキストの影の深さです。")] public int ShadowDepth { get { return _shadowDepth; } set { _shadowDepth = value; Invalidate(); } }
<Category("表示")> _ <Description("テキストの影の色です。")> _ Public Property ShadowColor() As Color Get : Return _shadowColor : End Get Set : _shadowColor = value : Invalidate() : End Set End Property <Category("表示")> _ <Description("テキストの影の深さです。")> _ Public Property ShadowDepth() As Integer Get : Return _shadowDepth : End Get Set : _shadowDepth = value : Invalidate() : End Set End Property
このようになります。説明はあまり必要ないですね。Category属性でカテゴリーを、Description属性で説明文を指定します。VB.NETでは1行に書かなければならないので、行末にアンダースコアが付いていることに注意してください。
なお、属性は次のようにまとめて1行に書くこともできます。
[Category("表示"), Description("テキストの影の色です。")]
<Category("表示"), Description("テキストの影の色です。")> _
カテゴリーは新たに作ることもできます。例えば[Category(“影”)]のように。
もし、プロパティウィンドウに表示する名前を変えたい場合は、次のようにDisplayName属性を使えば可能です。
[DisplayName("影の色")]
<DisplayName("影の色")> _
数は少ないですが、属性はクラスにも用意されています。コントロールを初めてフォームに貼り付けた時に、プロパティウィンドウでアクティブになるプロパティを指定するためのDefaultProperty。デザイン画面でコントロールをダブルクリックした時に、どのイベントハンドラが作成されるのかを指定するDefaultEventです。
[DefaultProperty("Text")] [DefaultEvent("Click")] public partial class CustomControl1 : Control {}
<Defaultproperty("Text")> _ <Defaultevent("Click")> _ Public Partial Class CustomControl1 : Inherits Control End Class
2014年1月6日