![]() ![]() ![]() |
![]() |
||
3:デザイン時に自作コントロールの設定を変更する方法 ・はじめに ・プロパティウィンドウでの操作 ・プロパティへの文字列の代入 ・ネストしたプロパティの展開 ・独自ドロップダウンUIでのプロパティ操作 ・ダイアログでのプロパティ操作 ・カスタムエディタ(デザイナ)の表示 ・デザイン時のコードを別アセンブリにする ・最後に ・アクセス修飾子の省略 ◆付録 (本稿で取り上げたソースコードおよびサンプルプログラム) \MyPoint1 「プロパティへの文字列の代入」サンプル \MyPoint2 「ネストしたプロパティの展開」サンプル \MyPoint3 「独自ドロップダウンUIでのプロパティ操作」サンプル \MyPoint4 「ダイアログでのプロパティ操作」サンプル \MyPoint5 「カスタムエディタ(デザイナ)の表示」サンプル \Reflection 「デザイン時のコードを別アセンブリにする」サンプル |
||
![]() |
||
今回は、自作のコントロールをVisualStudio.NET(以下VS.NET)で使用する場合に役立つ方法を説明します。 コントロールを利用するときは、必ず設定を変更し、自分の使用目的に合うようにします。 その際、コードでの設定変更以外に、VS.NETでのデザイン時にも各種の設定値を変更できるように なっていれば格段に便利なコントロールとなります。 また、コード上での値の設定は、VS.NET上のデザイン画面に基本的には反映されていないため、 プログラムを実際に実行してみなければ設定後の動作がわからないというデメリットもあります。 デザイン時にプロパティを設定する方法として、主に以下の3つがあります。 @VS.NETのプロパティウィンドウを使用する AVS.NETから、独自のエディタ(デザイナ)を起動して値を設定する BVS.NETのデザイン画面でマウスを使用して直接値を変更できるようにする Bの方法は、実際にはAのデザイナを実装/使用することでより細かい設定が可能です。 詳細は後述しますが、Aのデザイナを実装する場合は、コントロールを配置するコンテナとして 通常のフォームを使用するため、通常のフォームのプログラミングで済みます。 これに対して、Bの方法をとる場合、VS.NETをコンテナとするため、 若干複雑なプログラミングを行なわなければなりません。 そのため、あえてBは避け、ここでは@とAの実装方法に関して説明してゆくことにします。 |
![]() |
|||||||||||||
まずは、プロパティウィンドウでの操作方法に関して見てみましょう。 例として、標準Labelコントロールのプロパティを取り上げます。 フォームのデザイン画面で目的のコントロールを選択して、右クリックすると表示される コンテキストメニューから[プロパティ]を選択すると、プロパティウィンドウにそのコントロールの プロパティが表示されるようになっています(図1)。 図1:プロパティウィンドウの表示 ![]() ここにはプロパティに関するさまざまな情報が表示されるほかに、 それぞれのプロパティを簡単に設定するための工夫がされています。 プロパティの設定には大きく分けて、以下のような特徴があります。
図2:ネストされたプロパティの展開(Fontプロパティ) ![]() 図3:独自UIでのプロパティ操作(Dockプロパティ) ![]() 図4:ダイアログでのプロパティ操作(Fontダイアログ) ![]() 以降で、上記のそれぞれの特徴に関して、5つのサンプルプログラムを利用して 実装方法も含めて説明してゆきます。 |
|||||||||||||
ページトップへ![]() |
![]() |
||
実は標準コントロールにあるほとんどのプロパティ、特にプロパティウィンドウに表示されるプロパティは、 文字列で値を設定することが可能です。 では、FontプロパティやSizeプロパティなど、String型ではないプロパティの値を文字列で 表わすにはどうすればいいのでしょうか? .NET Frameworkでは型変換を使用します。 型変換にはその名もずばり、TypeConverterクラスを使用します。 以下に独自のクラスに対するTypeConverterを実装する方法に関して説明してゆきます。 手順は以下の通りです。 手順1:TypeConverterから派生したクラスを作成 手順2:CanConvertFromメソッドをオーバーライド 手順3:ConvertFromメソッドをオーバーライド 手順4:CanConvertToメソッドをオーバーライド 手順5:ConvertToメソッドをオーバーライド 手順6:IsValidメソッドをオーバーライド ただし、手順4のCanConvertToメソッドは、String型への変換に関してはデフォルトでTrueを返すので、 ここではオーバーライドする必要はありません。 逆に文字列への変更を不可能にするため、CanConvertToメソッドを、 public override bool CanConvertTo( ITypeDescriptorContext context, Type dstType) { if (dstType == typeof(string)) return false; return base.CanConvertTo(context, dstType); } のようにオーバーライドしても無視されてしまいました。 これは、.NET Frameworkのすべての型がObject型から派生しており、 必ずToString( )メソッドを実装するからだと推察されます。 もっとも、文字列への変換を禁止する必要は、まず“ない”といえるため、このような実装になっているのでしょう。 IsValidメソッドのオーバーライドは、値の妥当性を細かく検証する必要がある場合などにのみ必要です。 通常の無効な入力に関しては、このオーバーライドを実装しなくても、ConvertFrom内で値を 変換できなかった場合にExceptionが発生し、不正な値を設定することはできません。 最後に、作成したTypeConverterを、TypeConverterAttributeでクラスに関連付けます。 なお、TypeConverterAttributeは、「AttributeTargets.All」であるため、 プロパティやフィールドにも関連付けることができます。 そのため、特定のプロパティやフィールドの型変換の挙動のみを変更することも可能です。 ソースコードの詳細はサンプルMyPoint1を参照してください。 |
||
.NET Roomトップへ | ページトップへ | 次へ![]() |