カスタム コントロールのための 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 コントロールとボタンのプロパティを示すプロパティ グリッドを示しています。

ボタンとプロパティ ウィンドウが表示されている Visual Studio の Windows Forms デザイナー

カスタム コントロールに関する情報がプロパティ グリッドにどのように表示されるか制御できます。 属性はカスタム コントロール クラスまたはクラス プロパティに適用されます。

クラスの属性

次の表には、デザイン時にカスタム コントロールおよびカスタム コンポーネントの動作を指定するために適用できる属性が示されています。

属性 説明
DefaultEventAttribute コンポーネントの既定のイベントを指定します。
DefaultPropertyAttribute コンポーネントの既定のプロパティを指定します。
DesignerAttribute コンポーネントのデザイン時サービスを実装するために使用されるクラスを指定します。
DesignerCategoryAttribute クラスのデザイナーが特定のカテゴリに属することを指定します。
ToolboxItemAttribute ツールボックス項目の属性を表します。
ToolboxItemFilterAttribute ツールボックス項目に使用するフィルター文字列とフィルターの種類を指定します。

プロパティの属性

次の表には、カスタム コントロールおよびカスタム コンポーネントのプロパティや他のメンバーに適用できる属性が示されています。

属性 説明
AmbientValueAttribute プロパティに渡す値を指定し、そのプロパティが別のソースから値を取得するようにします。 これは "アンビエンス" と呼ばれています。
BrowsableAttribute プロパティまたはイベントが [プロパティ] ウィンドウに表示されるかどうかを指定します。
CategoryAttribute PropertyGrid コントロールが Categorized モードに設定されているときに、コントロールに表示するプロパティまたはイベントを分類するカテゴリの名前を指定します。
DefaultValueAttribute プロパティの既定値を指定します。
DescriptionAttribute プロパティまたはイベントの説明文を指定します。
DisplayNameAttribute 値を返さず引数を受け取らないプロパティ、イベント、またはパブリック メソッドの表示名を指定します。
EditorAttribute プロパティの変更に使用するエディターを指定します。
EditorBrowsableAttribute プロパティまたはメソッドをエディターで表示できるかどうかを指定します。
HelpKeywordAttribute クラスまたはメンバーのコンテキスト キーワードを指定します。
LocalizableAttribute プロパティをローカライズする必要があるかどうかを指定します。
PasswordPropertyTextAttribute アスタリスクなどの文字でオブジェクトのテキスト表記を隠すように指示します。
ReadOnlyAttribute デザイン時に、この属性がバインドされるプロパティが読み取り専用か読み取り/書き込み可能かを指定します。
RefreshPropertiesAttribute 関連付けられているプロパティ値が変更されたときに、プロパティ グリッドが更新されるように指定します。
TypeConverterAttribute この属性が関連付けられているオブジェクトのコンバーターとして使用する型を指定します。

カスタム コントロール デザイナー

カスタム コントロールのデザイン時エクスペリエンスは、関連するカスタム デザイナーを作成することによって拡張できます。 既定では、カスタム コントロールはホストのデザイン サーフェイスに表示され、実行時と同じように表示されます。 カスタム デザイナーを使用すると、コントロールのデザイン時のビューを拡張し、アクション項目、スナップ ライン、その他の項目を追加できるため、ユーザーがコントロールのレイアウト方法と構成方法を判断するのに役立ちます。 たとえば、次の図に示すように、デザイン時に ToolStrip デザイナーは、ユーザーが個々の項目を追加、削除、および構成するための追加のコントロールを追加します。

分割コンテナーのデザイン時ビューが表示されている Visual Studio の Windows Forms デザイナー。

次の手順を実行して、独自のカスタム デザイナーを作成できます。

  1. Microsoft.WinForms.Designer.SDK NuGet パッケージへの参照を追加します。
  2. Microsoft.DotNet.DesignTools.Designers.ControlDesigner クラスから継承する型を作成します。
  3. ユーザー コントロール クラスで System.ComponentModel.DesignerAttribute クラス属性でクラスをマークし、前の手順で作成した型を渡します。

詳細については、「.NET Framework との違い」セクションを参照してください。

実施項目

デザイナー アクションは、ユーザーが一般的なタスクをすばやく実行できる状況依存のメニューです。 たとえば、フォームに TabControl を追加する場合、コントロールに対してタブを追加および削除します。 タブは、タブ コレクション エディターを表示する TabPages プロパティを使用して、[プロパティ] ウィンドウで管理されます。 次の図に示すように、TabControl はユーザーに常に [プロパティ] の一覧から TabPages プロパティを探すように強制するのではなく、コントロールが選択されている場合にのみ表示されるスマート タグ ボタンを提供します。

タブ コントロールのスマート タグ ボタンが表示されている Visual Studio の Windows Forms デザイナー。

スマート タグを選択すると、アクションの一覧が表示されます。

タブ コントロールのスマート タグ ボタンが押され、アクションの一覧が表示された Visual Studio の Windows Forms デザイナー。

[タブの追加] アクションと [タブの削除] アクションを追加すると、コントロールのデザイナーによってタブをすばやく追加または削除できるようになります。

アクション項目リストの作成

アクション項目リストは、作成する ControlDesigner 型によって提供されます。 次の手順は、独自のアクション リストを作成するための基本的なガイドです。

  1. Microsoft.WinForms.Designer.SDK NuGet パッケージへの参照を追加します。
  2. Microsoft.DotNet.DesignTools.Designers.Actions.DesignerActionList から継承する新しいアクション リスト クラスを作成します。
  3. ユーザーがアクセスするアクション リストにプロパティを追加します。 たとえば、クラスに bool プロパティまたは Boolean プロパティ (Visual Basic の場合) を追加すると、アクション リストに CheckBox コントロールが作成されます。
  4. [カスタム コントロール デザイナー] セクションの手順に従って、新しいデザイナーを作成します。
  5. デザイナー クラスで、Microsoft.DotNet.DesignTools.Designers.Actions.DesignerActionListCollection 型を返す ActionLists プロパティをオーバーライドします。
  6. アクション リストを DesignerActionListCollection インスタンスに追加して返します。

アクション リストの例については、Windows フォーム デザイナー拡張性ドキュメントとサンプルの GitHub リポジトリ (具体的には TileRepeater.Designer.Server/ControlDesigner フォルダー) を参照してください。

[プロパティ] ウィンドウでは、プロパティのバッキング型が列挙型、ブール型、数値の場合など、ほとんどのプロパティはグリッドで簡単に編集できます。

配置プロパティをが表示された Windows Forms アプリの Visual Studio プロパティ ウィンドウ。

場合によっては、プロパティの複雑さが増し、ユーザーがプロパティの変更に使用できるカスタム ダイアログが必要になる場合があります。 たとえば、Font プロパティは System.Drawing.Font 型で、フォントの外観を変更する多くのプロパティが含まれています。 これは [プロパティ] ウィンドウでは簡単に表示できないため、このプロパティはカスタム ダイアログを使用してフォントを編集します。

Windows Forms アプリの Visual Studio フォント ダイアログ。

カスタム コントロール のプロパティが 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