基本デザイナ クラス
更新 : 2007 年 11 月
すべてのデザイナは、基本的なデザイナ インターフェイス メソッドを定義する IDesigner インターフェイスを実装します。.NET Framework には、特定の型のコンポーネントやコントロールをサポートするデザイナで役立つメソッドを提供する基本デザイナ クラスのセットも用意されています。
IDesigner インターフェイス
デザイナ クラスは、次のコード例に示すように、IDesigner インターフェイスを実装する必要があります。
Public Interface IDesigner
Sub Dispose()
Sub Initialize(component As IComponent)
' Other methods.
...
ReadOnly Property Component() As IComponent
' Other properties.
...
End Interface
public interface IDesigner {
void Dispose();
void Initialize(IComponent component);
// Other methods.
...
IComponent Component {
get;
}
// Other properties.
...
}
IDesigner の Initialize メソッドは、デザイナのコンポーネントが配置および初期化され、デザイナが作成された後に呼び出されます。Initialize メソッドをオーバーライドして、コンポーネントやデザイナの初期化時に発生するアクションを実行できます。コンストラクタによるコンポーネントの初期化を置き換えることはできませんが、コンストラクタを補強したり、コンストラクタが初期化したプロパティをリセットしたりできます。この初期化メソッドによって、IDesigner の Component プロパティが設定されます。このメソッドをオーバーライドする場合は、必ず Initialize メソッドから base.Initialize(component) を呼び出します。IDesigner のコンポーネントには、コンポーネントの Component プロパティからアクセスできます。
Component プロパティにより、デザイナに関連付けられているコンポーネントにアクセスできます。このプロパティは、デザイナ オブジェクトが初めて作成され、その Initialize メソッドが呼び出されるときに設定されます。コンポーネントにはサイトが関連付けられており、デザイナはこのサイトを使用してデザイナのホストからサービスを取得できます。
コンポーネントやコントロールをダブルクリックすると、DoDefaultAction メソッドが呼び出されます。
Verbs プロパティをオーバーライドして、コンポーネントのショートカット メニューのメニュー項目を拡張するために必要なオブジェクトを格納する DesignerVerbCollection を返すことができます。
デザイナ オブジェクトを破棄する必要が生じると、Dispose メソッドが呼び出されます。このメソッドは、デザイン コンテナからコンポーネントが削除されるときに必ず呼び出されます。
コンポーネントの基本デザイナ クラス
ComponentDesigner クラスは IDesigner インターフェイスおよび IDesignerFilter インターフェイスを実装して、一部のコンポーネントのデザイナで役に立つ追加のメソッドを提供します。
Windows フォーム コントロールの基本デザイナ クラス
Windows フォーム コントロールの基本デザイナ クラスは ControlDesigner です。このクラスは ComponentDesigner の派生クラスで、Windows フォーム コントロールの外観や動作のカスタマイズに役立つメソッドを提供します。Windows フォーム デザイナの実装例については、「方法 : コントロール用デザイナを実装する」を参照してください。
DocumentDesigner クラスには、入れ子になったコントロールをサポートし、スクロール メッセージを受け取る Control に対して、デザイン モードでの動作を拡張し、ルート レベルのデザイン モード ビューを提供する基本デザイナ クラスがあります。詳細については、「方法 : デザイン時機能を活用した Windows フォーム コントロールを作成する」を参照してください。
ASP.NET サーバー コントロールの基本デザイナ クラス
ASP.NET サーバー コントロールの基本デザイナ クラスは ControlDesigner です。このクラスは、カスタムのデザイン時 HTML レンダリングの基本機能を提供します。テンプレートの編集などのタスクに関するその他の基本クラスについては、「ASP.NET Web ページのデザイン時サポート」で説明します。
デザイン時の統合のための基本クラス
TypeConverter クラスは、テキスト表現との間で型を変換するための基本クラスを提供します。型コンバータの詳細については、「方法 : 型コンバータを実装する」または「一般的な型変換」を参照してください。
UITypeEditor クラスは、デザイン時環境のカスタム型エディタの実装から派生し、拡張可能な基本クラスを提供します。UITypeEditor の実装の詳細については、「ユーザー インターフェイス型エディタの概要」を参照してください。
デザイナの外観および動作のための基本クラス
Behavior クラスを拡張して、選択、ドラッグ、サイズ変更などの動作を含む、すべての種類のユーザー インターフェイス動作を開発できます。描画およびヒット テストは、Glyph クラスによって実行されます。
詳細については、「動作サービスの概要」を参照してください。
デザイナ ローダーの基本クラス
BasicDesignerLoader クラスは、IDesignerLoaderService インターフェイスの実装を提供します。BasicDesignerLoader はデザイナ ローダーの完全な実装で、永続化の形式とは無関係です。
CodeDomDesignerLoader は、Code Document Object Model (CodeDOM) に基づいて完全なデザイナ ローダーを提供する抽象クラスです。
デザイナのシリアル化の基本クラス
CodeDomSerializerBase クラスは、CodeDomSerializer クラスの基本クラスを提供します。CodeDomSerializerBase クラスは、CodeDomSerializer と TypeCodeDomSerializer クラスの間で、共有基本クラスとして使用されます。
DesignerSerializationManager クラスは、IDesignerSerializationManager インターフェイスの実装を提供します。
詳細については、「デザイナのシリアル化の概要」を参照してください。
スマート タグの基本クラス
DesignerActionList クラスは、スマート タグ パネルの作成に使用される項目のリストを定義する型の基本クラスを提供します。詳細については、「方法 : Windows フォーム コンポーネントにスマート タグを追加する」を参照してください。
カスタム レイアウトの基本クラス
LayoutEngine クラスは、レイアウト エンジンを実装するための基本クラスを提供します。TableLayoutPanel および FlowLayoutPanel コントロールは、LayoutEngine クラスを使用してレイアウトの動作を提供します。詳細については、「方法 : カスタム レイアウト エンジンを実装する」を参照してください。
標準デザイナ
Windows Software Development Kit (SDK) には、特定の型のコンポーネントをサポートするデザイナのセットが用意されています。これらのデザイナの名前は、デザインの対象となるコンポーネント名にサフィックスとして Designer を追加したものです。たとえば、System.Windows.Forms.Control クラスのデザイナは System.Windows.Forms.Design.ControlDesigner です。
一般的なデザイナの機能
デザイナからのデザイン時サービスへのアクセス
多くのデザイン時サービスは、要求するサービスの種類を GetService メソッドに渡すことによって取得できます。Component および ComponentDesigner には、GetService メソッドがあります。また、IServiceProvider には GetService メソッドがあります。これは、デザイン時モードの IComponent の Site プロパティによって返される ISite によって実装されます。
GetService メソッドを使用して IDesignerHost サービス インターフェイスおよび IMenuCommandService を取得するコードを次に示します。
詳細については、「方法 : デザイン時サービスにアクセスする」を参照してください。
このコードは、デザイン モードのサービス プロバイダ インターフェイスからサービスを取得する方法を示しています。
' Obtain an IDesignerHost service from the design-time environment.
Dim host As IDesignerHost = CType(Me.Component.Site.GetService(GetType(IDesignerHost)), IDesignerHost)
' Obtain an IMenuCommandService service.
Dim mcs As IMenuCommandService = CType(Me.Component.Site.GetService(GetType(IMenuCommandService)), IMenuCommandService)
// Obtain an IDesignerHost service from the design-time environment.
IDesignerHost host = (IDesignerHost)this.Component.Site.GetService(typeof(IDesignerHost));
// Obtain an IMenuCommandService service.
IMenuCommandService mcs =
(IMenuCommandService)this.Component.Site.GetService(typeof(IMenuCommandService));
デザイナからのプロジェクト コンポーネントへのアクセス
デザイナは、IDesignerHost サービス インターフェイスの Container プロパティの Components コレクションにアクセスすることによって、デザイン モード ドキュメント内のコンポーネントにアクセスできます。現在のデザイン モード プロジェクト内のコンポーネントにアクセスする方法を次のコード例に示します。
' Obtains an IDesignerHost service from the design-time environment.
Dim host As IDesignerHost = CType(Me.Component.Site.GetService(GetType(IDesignerHost)), IDesignerHost)
' Gets the components container for the current design-time project.
Dim container As IContainer = host.Container
' The host.Container IContainer contains each IComponent in the project.
// Obtains an IDesignerHost service from the design-time environment.
IDesignerHost host = (IDesignerHost)this.Component.Site.GetService(typeof(IDesignerHost));
// Gets the components container for the current design-time project.
IContainer container = host.Container;
// The host.Container IContainer contains each IComponent in the project.
コンポーネント コレクションにアクセスしたら、TypeDescriptor メソッドと PropertyDescriptor オブジェクトを使用して、コンポーネントのプロパティの型を識別し、値を設定できます。また、IDesignerHost インターフェイスの CreateComponent メソッドを使用して、コンポーネントを作成することもできます。
デザイナの拡張
デザイナが関連付けられたコンポーネントから派生コンポーネントを作成すると、既定では基本クラスのデザイナが派生コンポーネントに関連付けられます。コンポーネントに別のデザイナを関連付けるには、関連付けるデザイナの型を指定する DesignerAttribute 属性を適用します。一般に、派生コンポーネントには、基本クラスのデザイナを拡張したデザイナが関連付けられます。
詳細については、「方法 : コントロール用デザイナを実装する」を参照してください。
デザイナを拡張するには
基本デザイナ クラスの派生クラスを定義します。
DesignerAttribute を適用して、新しいデザイナ クラスをコンポーネントに関連付けます。
次のコード例は、System.Web.UI.Design.WebControls.LabelDesigner を拡張して、System.Web.UI.WebControls.Label を拡張するカスタム ラベルに関連付けるデザイナを定義します。
Namespace MyControls.Design
Public Class MyLabelDesigner
Inherits System.Web.UI.Design.WebControls.LabelDesigner
End Class
End Namespace
Namespace MyControls
<Designer(GetType(MyControls.Design.MyLabelDesigner))> _
Public Class MyLabel
Inherits System.Web.UI.WebControls.Label
End Class
End Namespace
namespace MyControls.Design {
public class MyLabelDesigner : System.Web.UI.Design.WebControls.LabelDesigner {}
}
namespace MyControls {
[Designer(typeof(MyControls.Design.MyLabelDesigner))]
public class MyLabel : System.Web.UI.WebControls.Label {}
}
メモ : |
---|
シール クラスのデザイナを定義する場合や、他のクラスがデザイナを使用したり継承したりしないようにする場合は、デザイナ クラスをアセンブリの内部クラスとして指定できます。この場合、デザイナ ホストはこのデザイナのインスタンスを作成できますが、このインスタンスはパブリック オブジェクト モデルでは利用できません。 |
参照
処理手順
方法 : Windows フォームでデザイン時サポートにアクセスする