.NET 用 Windows フォームのビジュアル デザイナーでは、.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 9 や x64 など、アプリがターゲットに設定されているのと同じバージョンとプラットフォームの .NET で実行されます。
Visual Studio デザイナーでは、デザイナー上のコンポーネントとコントロールごとに .NET Framework プロキシ オブジェクトが作成されます。このオブジェクトは、 DesignToolsServer.exe デザイナーのプロジェクトの実際の .NET オブジェクトと通信します。
コントロール デザイナー
.NET の場合、コントロール デザイナーはMicrosoft.WinForms.Designer.SDK
で使用できる API を使用してコーディングする必要があります。 このライブラリは、.NET 用の .NET Framework デザイナーのリファクタリングです。 すべてのデザイナー型は異なる名前空間に移動しましたが、型名はほとんど同じです。 .NET 用の .NET Framework デザイナーを更新するには、名前空間を少し調整する必要があります。
- デザイナー クラスおよびその他の関連する型 (
ControlDesigner
やComponentTray
など) は、System.Windows.Forms.Design
名前空間からMicrosoft.DotNet.DesignTools.Designers
名前空間に移動しました。 -
System.ComponentModel.Design
名前空間のアクション リスト関連の型が、Microsoft.DotNet.DesignTools.Designers.Actions
名前空間に移動しました。 -
System.Windows.Forms.Design.Behavior
名前空間の装飾やスナップ線などの動作関連の型は、Microsoft.DotNet.DesignTools.Designers.Behaviors
名前空間に移動しました。
カスタム型エディター
カスタム型エディターは、コントロール デザイナーよりも複雑です。 Visual Studio プロセスは .NET Framework ベースであるため、Visual Studio のコンテキスト内に表示されるすべての UI も .NET Framework ベースである必要があります。 この設計では、たとえば、プロパティ グリッドの [ …
] ボタンをクリックして呼び出されたカスタム型エディターを表示する .NET コントロールを作成する場合に、問題が発生します。 ダイアログを Visual Studio のコンテキスト内に表示することはできません。
アウトプロセス デザイナーは、装飾、組み込みの型エディター、カスタム描画など、ほとんどのコントロール デザイナー機能を処理します。 新しい型エディターの表示など、カスタム モーダル ダイアログを表示する必要がある場合は、プロセス外デザイナーが提供するプロキシ オブジェクトクライアントサーバー通信をレプリケートする必要があります。 これにより、古い .NET Framework システムよりもはるかに多くのオーバーヘッドが発生します。
カスタム コントロール プロパティで Windows フォームによって提供される型エディターを使用している場合は、 EditorAttribute を使用して、Visual Studio で使用する対応する .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
型エディターを作成する
型エディターを提供するカスタム デザイナーを作成するには、次の一覧で説明するように、さまざまなプロジェクトが必要です。
-
Control
: このプロジェクトは、コントロールのコードを含むカスタム コントロール ライブラリです。 これは、ユーザーがコントロールを使用するときに参照するライブラリです。 -
Control.Client
: カスタム デザイナー UI ダイアログを含む Windows フォーム for .NET Framework プロジェクト。 -
Control.Server
: コントロールのカスタム デザイナー コードを含む Windows フォーム for .NET プロジェクト。 -
Control.Protocol
:Control.Client
プロジェクトとControl.Server
プロジェクトの両方で使用される通信クラスを含む .NET Standard プロジェクト。 -
Control.Package
: 他のすべてのプロジェクトを含む NuGet パッケージ プロジェクト。 このパッケージは、Visual Studio Windows フォーム for .NET ツール をホストし、コントロール ライブラリとデザイナーを使用できるように書式設定されています。
型エディターが ColorEditor や FileNameEditorなどの既存のエディターから派生した場合でも、Visual Studio のコンテキストで表示する新しい UI クラス型が用意されているため、そのプロキシ オブジェクトクライアントサーバー通信を作成する必要があります。 ただし、その型エディターを Visual Studio に実装するコードははるかに簡単です。
重要
このシナリオについて詳しく説明するドキュメントが進行中です。 そのドキュメントが公開されるまでは、次のブログ記事とサンプルを使用して、このプロジェクト構造の作成、発行、および使用について説明します。
.NET Desktop feedback