2012-01-04 3 views
4

FormTableLayoutPanelがあり、Labelをセルにドラッグすると、Labelコントロールでいくつかのプロパティを利用できます。私はフォーム上のTooltipコントロールをドラッグすると、同じ構造が使用されると思います。クラスに追加のプロパティを与えるために使用するデザインパターンはどれですか?

これを達成するためにどのデザインパターンが使用されているかを知りたいと思います。これはデコレータパターンですか?

+0

TableLayoutPanelのラベルが表示されている場合は**表示されているプロパティのみを意味しますか? – Tigran

答えて

7

あなたが見ているものは、Extender Providersと呼ばれています。

たとえば、ツールチップコンポーネントがフォームに追加されると、 というプロパティが、そのフォームの各コントロールにToolTipという名前で提供されます。 ToolTip プロパティは、接続されているPropertyGridコントロールに表示されます。 http://msdn.microsoft.com/en-us/library/ms171836.aspx

私は正確に、彼らはどのように動作するかを説明し、よく知られたパターンを考えることはできませんが、仕組みは簡単です。

IExtenderProviderを実装する必要があります。 WinFormsデザイナは、サーフェス上の他のコントロールに対してCanExtendを呼び出し、エクステンダは各コントロールに追加の属性を提供するかどうかを指定できます。

public interface IExtenderProvider { 
    bool CanExtend(object extendee); 
} 

他のコントロールが拡張されることを実際の属性はProvidePropertyAttributea method to provide the valueを使用して宣言されています。

+0

WinFormsのデザイン時に、WPFの添付プロパティの実装のように見えます。 – Tigran

+0

"パターン"は多態性です。 – Tigran

+0

@Tigran:実装をサブクラス化してオーバーライドしているわけではありません。それは、おそらく訪問者のヒントを持っているかもしれません。それぞれのコントロールに対して 'CanExtend'を呼び出すことによってですが、' CanExtend'メソッドの型チェックに依存しているので、訪問者ではありません。また、デザイナのプロパティグリッドに拡張属性が実際にどのように公開されているかは、未知の内部メカニズムです(実際には、古いMSDN記事があります)。 –

1

いいえ、これはデザインパターンでは達成されません。これらのプロパティは、単にコントロールによって公開されるパブリックプロパティであり、これらのプロパティは継承を介してコントロールに追加されます(サブクラスControl)。ビジュアルスタジオのデザイナーは、これらのコントロールを実装するクラスを調べて、それらが公開するプロパティを判断し、設定するためのUIを提供します。

関連する問題