共用方式為


設計師的變更自 .NET Framework 開始

Windows Forms for .NET 的視覺化設計工具自 .NET Framework 以來已有一些改善和變更。 這些變更主要影響自訂控制項設計工具。 本文說明自 .NET Framework 以來的主要差異。

Visual Studio 是以 .NET Framework 為基礎的應用程式,因此,適用於 Windows Forms 的視覺化設計工具也是以 .NET Framework 為基礎。 進行 .NET Framework 專案時,Visual Studio 環境和所設計的 Windows Forms 應用程式都在相同的流程中執行:devenv.exe。 當您使用 Windows Forms .NET (而非 .NET Framework) 應用程式時,這會造成問題。 .NET 和 .NET Framework 程式碼無法在相同的流程中運作。 因此,Windows Forms .NET 使用不同的設計工具,亦即「處理緒外」設計工具。

外部流程設計器

跨程序設計工具是一個名為 DesignToolsServer.exe 的程序,並與 Visual Studio 的 devenv.exe 程序同時運行。 DesignToolsServer.exe進程會在應用程式設定為目標的相同 .NET 版本和平臺上執行,例如 .NET 9 和 x64。

在 Visual Studio 的設計師中,針對設計師上的每個元件和控制項,會建立 .NET Framework 的 Proxy 物件,這些物件會在 DesignToolsServer.exe 設計工具中的專案中與實際的 .NET 物件進行通訊。

控制設計師

針對 .NET,控制項設計工具必須使用 Microsoft.WinForms.Designer.SDK API (可在 NuGet 取得) 編碼。 此程式庫為適用於 .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 的內容中顯示。

跨進程設計器會處理大部分控制設計器功能,例如裝飾物、內建類型編輯器和自訂繪製。 每當您需要顯示自訂模態對話方塊時(例如顯示新類型編輯器),您需要重新建立該跨處理序設計工具所提供的 proxy-object 客戶端-伺服器通訊。 這會產生比舊的 .NET Framework 系統更多的額外負荷。

如果您的自訂控制項屬性使用 Windows Forms 所提供的類型編輯器,您可以使用 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 Forms for .NET Framework 專案。
  • Control.Server:包含控制項自訂設計工具程式碼的 Windows Forms for .NET 專案。
  • Control.Protocol:包含 Control.ClientControl.Server 專案使用之通訊類別的 .NET Standard 專案。
  • Control.Package:包含所有其他專案的 NuGet 套件專案。 此套件的格式設計允許 Visual Studio Windows Forms for .NET 工具來託管並使用您的控制項庫和設計器。

即使您的類型編輯器衍生自現有的編輯器 (例如 ColorEditorFileNameEditor),您還是必須建立該 Proxy-object client-server 通訊,因為您已提供希望在 Visual Studio 內容中顯示的新 UI 類別類型。 不過,在 Visual Studio 中實作該類型編輯器的程式碼會更簡單。

這很重要

此案例的詳細說明文件正在進行中。 在該文件發佈之前,請使用下列部落格文章和範例來引導您建立、發佈及使用此專案結構: