カスタム コントロールのための Visual Studio デザイン時サポート (Windows フォーム .NET)
Windows Forms デザイナーを操作する際にわかるように、Windows Forms のコントロールにはさまざまなデザイン時の機能が用意されています。 Visual Studio Designer によって提供される機能には、スナップ ライン、アクション項目、プロパティ グリッドなどがあります。 これらのすべての機能は、デザイン時にコントロールを操作してカスタマイズする簡単な方法を提供します。 この記事では、コントロールのユーザーにとってデザイン時のエクスペリエンスを向上させるために、カスタム コントロールに追加できるサポートの概要について説明します。
.NET Framework との違い
カスタム コントロールの多くの基本的なデザイン要素は .NET Framework と同じです。 ただし、アクション リスト、型コンバーター、カスタム ダイアログなどのより高度なデザイナー カスタマイズ機能を使用する場合は、処理する固有のシナリオがいくつかあります。
Visual Studio は .NET Framework ベースのアプリケーションであるため、Windows Form 用に表示される Visual Designer も .NET Framework に基づいています。 .NET Framework プロジェクトでは、Visual Studio 環境と Windows Forms アプリの両方が同じプロセス (devenv.exe) 内で稼働するよう設計されています。 これにより、Windows Form の .NET (.NET Framework ではない) アプリを使用しているときに問題が発生します。 .NET と .NET Framework は同時に同じプロセス内では機能しません。 その結果、Windows Form の .NET では、別のデザイナーである "アウトプロセス" デザイナーが使用されます。
アウトプロセス デザイナーは DesignToolsServer.exe と呼ばれるプロセスであり、Visual Studio の devenv.exe プロセスと共に実行されます。 DesignToolsServer.exe プロセスは、アプリが対象としている .NET の同じバージョンとプラットフォーム (.NET 7 や x64 など) で稼働します。 カスタム コントロールが devenv.exe に UI を表示する必要がある場合、devenv.exe との間の通信を容易にするためにクライアントサーバー アーキテクチャを実装する必要があります。 詳細については、「.NET Framework (Windows Forms .NET) 以降のデザイナーの変更」を参照してください。
[プロパティ] ウィンドウ
Visual Studio の [プロパティ] ウィンドウには、選択したコントロールまたはフォームのプロパティとイベントが表示されます。 通常、これはカスタム コントロールまたはコンポーネントに対して実行するカスタマイズの最初のポイントです。
次の図は、ビジュアル デザイナーで選択された Button
コントロールとボタンのプロパティを示すプロパティ グリッドを示しています。
カスタム コントロールに関する情報がプロパティ グリッドにどのように表示されるか制御できます。 属性はカスタム コントロール クラスまたはクラス プロパティに適用されます。
クラスの属性
次の表には、デザイン時にカスタム コントロールおよびカスタム コンポーネントの動作を指定するために適用できる属性が示されています。
属性 | 説明 |
---|---|
DefaultEventAttribute | コンポーネントの既定のイベントを指定します。 |
DefaultPropertyAttribute | コンポーネントの既定のプロパティを指定します。 |
DesignerAttribute | コンポーネントのデザイン時サービスを実装するために使用されるクラスを指定します。 |
DesignerCategoryAttribute | クラスのデザイナーが特定のカテゴリに属することを指定します。 |
ToolboxItemAttribute | ツールボックス項目の属性を表します。 |
ToolboxItemFilterAttribute | ツールボックス項目に使用するフィルター文字列とフィルターの種類を指定します。 |
プロパティの属性
次の表には、カスタム コントロールおよびカスタム コンポーネントのプロパティや他のメンバーに適用できる属性が示されています。
属性 | 説明 |
---|---|
AmbientValueAttribute | プロパティに渡す値を指定し、そのプロパティが別のソースから値を取得するようにします。 これは "アンビエンス" と呼ばれています。 |
BrowsableAttribute | プロパティまたはイベントが [プロパティ] ウィンドウに表示されるかどうかを指定します。 |
CategoryAttribute | PropertyGrid コントロールが Categorized モードに設定されているときに、コントロールに表示するプロパティまたはイベントを分類するカテゴリの名前を指定します。 |
DefaultValueAttribute | プロパティの既定値を指定します。 |
DescriptionAttribute | プロパティまたはイベントの説明文を指定します。 |
DisplayNameAttribute | 値を返さず引数を受け取らないプロパティ、イベント、またはパブリック メソッドの表示名を指定します。 |
EditorAttribute | プロパティの変更に使用するエディターを指定します。 |
EditorBrowsableAttribute | プロパティまたはメソッドをエディターで表示できるかどうかを指定します。 |
HelpKeywordAttribute | クラスまたはメンバーのコンテキスト キーワードを指定します。 |
LocalizableAttribute | プロパティをローカライズする必要があるかどうかを指定します。 |
PasswordPropertyTextAttribute | アスタリスクなどの文字でオブジェクトのテキスト表記を隠すように指示します。 |
ReadOnlyAttribute | デザイン時に、この属性がバインドされるプロパティが読み取り専用か読み取り/書き込み可能かを指定します。 |
RefreshPropertiesAttribute | 関連付けられているプロパティ値が変更されたときに、プロパティ グリッドが更新されるように指定します。 |
TypeConverterAttribute | この属性が関連付けられているオブジェクトのコンバーターとして使用する型を指定します。 |
カスタム コントロール デザイナー
カスタム コントロールのデザイン時エクスペリエンスは、関連するカスタム デザイナーを作成することによって拡張できます。 既定では、カスタム コントロールはホストのデザイン サーフェイスに表示され、実行時と同じように表示されます。 カスタム デザイナーを使用すると、コントロールのデザイン時のビューを拡張し、アクション項目、スナップ ライン、その他の項目を追加できるため、ユーザーがコントロールのレイアウト方法と構成方法を判断するのに役立ちます。 たとえば、次の図に示すように、デザイン時に ToolStrip デザイナーは、ユーザーが個々の項目を追加、削除、および構成するための追加のコントロールを追加します。
次の手順を実行して、独自のカスタム デザイナーを作成できます。
- Microsoft.WinForms.Designer.SDK NuGet パッケージへの参照を追加します。
Microsoft.DotNet.DesignTools.Designers.ControlDesigner
クラスから継承する型を作成します。- ユーザー コントロール クラスで System.ComponentModel.DesignerAttribute クラス属性でクラスをマークし、前の手順で作成した型を渡します。
詳細については、「.NET Framework との違い」セクションを参照してください。
実施項目
デザイナー アクションは、ユーザーが一般的なタスクをすばやく実行できる状況依存のメニューです。 たとえば、フォームに TabControl を追加する場合、コントロールに対してタブを追加および削除します。 タブは、タブ コレクション エディターを表示する TabPages プロパティを使用して、[プロパティ] ウィンドウで管理されます。 次の図に示すように、TabControl
はユーザーに常に [プロパティ] の一覧から TabPages
プロパティを探すように強制するのではなく、コントロールが選択されている場合にのみ表示されるスマート タグ ボタンを提供します。
スマート タグを選択すると、アクションの一覧が表示されます。
[タブの追加] アクションと [タブの削除] アクションを追加すると、コントロールのデザイナーによってタブをすばやく追加または削除できるようになります。
アクション項目リストの作成
アクション項目リストは、作成する ControlDesigner
型によって提供されます。 次の手順は、独自のアクション リストを作成するための基本的なガイドです。
- Microsoft.WinForms.Designer.SDK NuGet パッケージへの参照を追加します。
Microsoft.DotNet.DesignTools.Designers.Actions.DesignerActionList
から継承する新しいアクション リスト クラスを作成します。- ユーザーがアクセスするアクション リストにプロパティを追加します。 たとえば、クラスに
bool
プロパティまたはBoolean
プロパティ (Visual Basic の場合) を追加すると、アクション リストに CheckBox コントロールが作成されます。 - [カスタム コントロール デザイナー] セクションの手順に従って、新しいデザイナーを作成します。
- デザイナー クラスで、
Microsoft.DotNet.DesignTools.Designers.Actions.DesignerActionListCollection
型を返すActionLists
プロパティをオーバーライドします。 - アクション リストを
DesignerActionListCollection
インスタンスに追加して返します。
アクション リストの例については、Windows フォーム デザイナー拡張性ドキュメントとサンプルの GitHub リポジトリ (具体的には TileRepeater.Designer.Server/ControlDesigner
フォルダー) を参照してください。
モーダル ダイアログの型エディター
[プロパティ] ウィンドウでは、プロパティのバッキング型が列挙型、ブール型、数値の場合など、ほとんどのプロパティはグリッドで簡単に編集できます。
場合によっては、プロパティの複雑さが増し、ユーザーがプロパティの変更に使用できるカスタム ダイアログが必要になる場合があります。 たとえば、Font プロパティは System.Drawing.Font 型で、フォントの外観を変更する多くのプロパティが含まれています。 これは [プロパティ] ウィンドウでは簡単に表示できないため、このプロパティはカスタム ダイアログを使用してフォントを編集します。
カスタム コントロール のプロパティが Windows Forms によって提供される組み込みの型エディターを使用している場合は、EditorAttribute を使用することで、Visual Studio に使用させたい対応する .NET Framework エディターでプロパティをマークすることができます。 組み込みのエディターを使用すると、アウトプロセス デザイナーによって提供されるプロキシオブジェクト クライアントサーバー通信をレプリケートする必要がなくなります。
組み込みの型エディターを参照する場合は、.NET 型ではなく .NET Framework 型を使用します。
[Editor("System.Windows.Forms.Design.FileNameEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",
"System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
public string? Filename { get; set; }
<Editor("System.Windows.Forms.Design.FileNameEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")>
Public Property Filename As String
.NET Desktop feedback