基本デザイナー クラス
すべてのデザイナーは、基本的なデザイナー インターフェイス メソッドを定義する 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 フォーム コントロールを作成する」を参照してください。
[!メモ]
デザイン時アセンブリ System.Design.dll への参照を追加する必要があります。このアセンブリは、.NET Framework 4 Client Profile には含まれていません。System.Design.dll への参照を追加するには、プロジェクトのターゲット フレームワークを .NET Framework 4 に変更する必要があります。
ASP.NET サーバー コントロールの基本デザイナー クラス
ASP.NET サーバー コントロールの基本デザイナー クラスは ControlDesigner です。このクラスは、カスタムのデザイン時 HTML レンダリングの基本機能を提供します。
デザイン時の統合のための基本クラス
TypeConverter クラスは、テキスト表現との間で型を変換するための基本クラスを提供します。型コンバーターの詳細については、「方法 : 型コンバーターを実装する」または「一般的な型変換」を参照してください。
UITypeEditor クラスは、デザイン時環境のカスタム型エディターの実装から派生し、拡張可能な基本クラスを提供します。UITypeEditor の実装の詳細については、「ユーザー インターフェイス型エディターの概要」を参照してください。
デザイナーの外観および動作のための基本クラス
Behavior クラスを拡張して、選択、ドラッグ、サイズ変更などの動作を含む、すべての種類のユーザー インターフェイス動作を開発できます。描画およびヒット テストは、Glyph クラスによって実行されます。
詳細については、「動作サービスの概要」を参照してください。
[!メモ]
デザイン時アセンブリ System.Design.dll への参照を追加する必要があります。このアセンブリは、.NET Framework 4 Client Profile には含まれていません。System.Design.dll への参照を追加するには、プロジェクトのターゲット フレームワークを .NET Framework 4 に変更する必要があります。
デザイナー ローダーの基本クラス
BasicDesignerLoader クラスは、IDesignerLoaderService インターフェイスの実装を提供します。BasicDesignerLoader はデザイナー ローダーの完全な実装で、永続化の形式とは無関係です。
CodeDomDesignerLoader は、Code Document Object Model (CodeDOM) に基づいて完全なデザイナー ローダーを提供する抽象クラスです。
デザイナーのシリアル化の基本クラス
CodeDomSerializerBase クラスは、CodeDomSerializer クラスの基本クラスを提供します。CodeDomSerializerBase クラスは、CodeDomSerializer と TypeCodeDomSerializer クラスの間で、共有基本クラスとして使用されます。
DesignerSerializationManager クラスは、IDesignerSerializationManager インターフェイスの実装を提供します。
詳細については、「デザイナーのシリアル化の概要」を参照してください。
スマート タグの基本クラス
DesignerActionList クラスは、スマート タグ パネルの作成に使用される項目のリストを定義する型の基本クラスを提供します。詳細については、「方法 : Windows フォーム コンポーネントにスマート タグを追加する」を参照してください。
[!メモ]
デザイン時アセンブリ System.Design.dll への参照を追加する必要があります。このアセンブリは、.NET Framework 4 Client Profile には含まれていません。System.Design.dll への参照を追加するには、プロジェクトのターゲット フレームワークを .NET Framework 4 に変更する必要があります。
カスタム レイアウトの基本クラス
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 フォームでデザイン時サポートにアクセスする