次の方法で共有


.NET Framework (.NET Windows フォーム) 以降にデザイナーが変更される

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

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

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

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

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

コントロール デザイナー

.NET の場合、コントロール デザイナーは、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 ベースである必要があります。 この設計では、たとえば、プロパティ グリッドの button をクリックして呼び出されたカスタム型エディターを表示する .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 ダイアログを含む .NET Framework プロジェクトのWindows フォーム。
  • Control.Server: コントロールのカスタム デザイナー コードを含む .NET プロジェクトのWindows フォーム。
  • Control.Protocol: Control.ClientControl.Server プロジェクトの両方で使用される通信クラスを含む .NET Standard プロジェクト。
  • Control.Package: 他のすべてのプロジェクトを含む NuGet パッケージ プロジェクト。 このパッケージは、Visual Studio が .NET ツール ホスト用にWindows フォームし、コントロール ライブラリとデザイナーを使用できるように書式設定されています。

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

重要

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