共用方式為


設計工具自 .NET Framework (Windows Forms .NET) 以來的變更

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 7 和 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 控制項時,其顯示按一下屬性方格中的 button 來叫用自訂類型編輯器,此設計會造成問題。 對話方塊無法在 Visual Studio 的內容中顯示。

跨處理序設計工具會處理大部分的控制項設計工具功能,例如裝飾項、內建類型編輯器和自訂繪製。 每當您需要顯示自訂強制回應對話方塊時 (例如顯示新的類型編輯器),您需要複寫跨處理序設計工具所提供的 proxy-object client-server 通訊。 這會產生比舊的 .NET Framework 系統更多的額外負荷。

如果您的自訂控制項屬性使用 Windows Forms 所提供的類型編輯器,您可以使用 EditorAttribute 透過您希望 Visual Studio 使用之對應的 .NET Framework 編輯器來標記您的屬性。 藉由使用內建編輯器,您可以避免複寫由跨處理序設計工具所提供之 proxy-object client-server 通訊的需求。

[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 中實作該類型編輯器的程式碼會更簡單。

重要

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