.NET Framework (Windows Form .NET) 以降にデザイナーが変更されます

Visual Designer for Windows Form for .NET では、.NET Framework 以降、いくつかの機能強化と変更が行われました。 これらの変更は、カスタム コントロール デザイナーに大きく影響します。 この記事では、.NET Framework との主な違いについて説明します。

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

アウトプロセス デザイナー

アウトプロセス デザイナーは DesignToolsServer.exe と呼ばれるプロセスであり、Visual Studio の devenv.exe プロセスと共に実行されます。 DesignToolsServer.exe プロセスは、.NET 7 や x64 など、アプリがターゲットに設定されているのと同じバージョンとプラットフォームの .NET で実行されます。

Visual Studio デザイナーでは、デザイナー上のコンポーネントとコントロールごとに .NET Framework プロキシ オブジェクトが作成されます。このオブジェクトは、DesignToolsServer.exe デザイナーのプロジェクトの実際の .NET オブジェクトと通信します。

コントロール デザイナー

.NET の場合、コントロール デザイナーは、NuGet で使用できる Microsoft.WinForms.Designer.SDK API を使用してコーディングする必要があります。 このライブラリは、.NET 用の .NET Framework デザイナーのリファクタリングです。 すべてのデザイナー型が異なる名前空間に移動されましたが、型名はほとんど同じです。 .NET 用の .NET Framework デザイナーを更新するには、名前空間を少し調整する必要があります。

  • デザイナー クラスおよびその他の関連する型 (ControlDesignerComponentTray など) が名前空間 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 Form によって提供される型エディターを使用している場合は、Visual Studio に使用させたい対応する .NET Framework エディターで、EditorAttribute を使用してプロパティをマークすることができます。 組み込みのエディターを使用すると、アウトプロセス デザイナーによって提供されるプロキシオブジェクト クライアントサーバー通信をレプリケートする必要がなくなります。

[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 ダイアログを含む .NET Framework プロジェクト用のWindows Form。
  • Control.Server: コントロールのカスタム デザイナー コードを含む .NET プロジェクト用のWindows Form。
  • Control.Protocol: Control.ClientControl.Server プロジェクトの両方で使用される通信クラスを含む .NET Standard プロジェクト。
  • Control.Package: 他のすべてのプロジェクトを含む NuGet パッケージ プロジェクト。 このパッケージは、.NET ツール ホスト用 Visual Studio Windows Form を使用し、コントロール ライブラリとデザイナーを使用できるようにフォーマットされています。

型エディターが既存のエディター (ColorEditorFileNameEditor など) から派生している場合でも、Visual Studio のコンテキストで表示する新しい UI クラス型が用意されているため、そのプロキシオブジェクト クライアントサーバー通信を作成する必要があります。 ただし、その型エディターを Visual Studio に実装するコードははるかに簡単です。

重要

このシナリオについて詳しく説明するドキュメントを作成中です。 そちらのドキュメントが公開されるまでは、次のブログ記事とサンプルを使用して、このプロジェクト構造の作成、発行、使用について説明します: