次の方法で共有


Visual Studio でのカスタム コントロールのデザイン時のサポート

Windows フォーム デザイナーを操作する際に気づいたように、Windows フォーム コントロールにはさまざまなデザイン時機能が用意されています。 Visual Studio Designer によって提供される機能には、スナップ線、アクション項目、プロパティ グリッドなどがあります。 これらの機能はすべて、デザイン時にコントロールを操作してカスタマイズする簡単な方法を提供します。 この記事では、コントロールのコンシューマーにとってデザイン時のエクスペリエンスを向上させるために、カスタム コントロールに追加できるサポートの種類の概要について説明します。

.NET Framework とは何が違うのか

カスタム コントロールの多くの基本的な設計要素は、.NET Framework から同じままです。 ただし、アクション リスト、型コンバーター、カスタム ダイアログなど、より高度なデザイナーカスタマイズ機能を使用する場合は、処理する固有のシナリオがいくつかあります。

Visual Studio は .NET Framework ベースのアプリケーションであるため、Windows フォーム用に表示されるビジュアル デザイナーも .NET Framework に基づいています。 .NET Framework プロジェクトでは、Visual Studio 環境と設計されている Windows フォーム アプリの両方が同じプロセス内 で実行devenv.exe。 これにより、Windows フォーム .NET (.NET Framework ではなく) アプリを使用しているときに問題が発生します。 .NET と .NET Framework の両方が同じプロセス内で動作することはできません。 その結果、Windows フォーム .NET では、"アウト プロセス" デザイナーである別のデザイナーが使用されます。

アウトプロセス デザイナーは 、DesignToolsServer.exeと呼ばれるプロセスであり、Visual Studio の devenv.exe プロセスと共に実行されます。 DesignToolsServer.exe プロセスは、アプリが対象としている .NET の .NET 9 や x64 など、同じバージョンとプラットフォームで実行されます。 カスタム コントロールが Visual Studio で UI を表示する必要がある場合、カスタム コントロールは、devenv.exeとの間の通信を容易にするために、クライアント/サーバー アーキテクチャを実装する必要があります。 詳細については、「 .NET Framework 以降のデザイナーの変更」を参照してください。

プロパティ ウィンドウ

Visual Studio の [プロパティ] ウィンドウには、選択したコントロールまたはフォームのプロパティとイベントが表示されます。 これは通常、カスタム コントロールまたはコンポーネントに対して実行するカスタマイズの最初のポイントです。

次の図は、ビジュアル デザイナーで選択された Button コントロールと、ボタンのプロパティを示すプロパティ グリッドを示しています。

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

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

クラスの属性

次の表に、デザイン時にカスタム コントロールとコンポーネントの動作を指定するために適用できる属性を示します。

特性 説明
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 フォーム デザイナー。

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

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

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

アクション アイテム

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

タブ コントロールのスマート タグ ボタンを示す Visual Studio の Windows フォーム デザイナー。

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

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

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

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

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

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

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

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

配置プロパティを示す Windows フォーム アプリの Visual Studio の [プロパティ] ウィンドウ。

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

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

カスタム コントロール プロパティで Windows フォームによって提供される組み込みの型エディターを使用している場合は、 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