该设计器自 .NET Framework(Windows Form .NET)以来发生了更改

适用于 .NET 的 Windows Form可视设计器自 .NET Framework 以来进行了一些改进和更改。 这些更改主要影响自定义控件设计器。 本文介绍与 .NET Framework 的主要区别。

Visual Studio 是基于 .NET Framework 的应用程序,因此,你在 Windows Forms 上看到的可视设计器也基于 .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 上运行,例如 .NET 7 和 x64

在 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提供的类型编辑器,则可使用 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 Form .NET Framework 项目。
  • Control.Server:一个 Windows Form .NET 项目,其中包含控件的自定义设计器代码。
  • Control.Protocol:一个 .NET Standard 项目,其中包含 Control.ClientControl.Server 项目使用的通信类。
  • Control.Package:包含所有其他项目的 NuGet 包项目。 该包的格式允许 Visual Studio Windows Form .NET 工具托管并使用你的控件库和设计器。

即使类型编辑器派生自现有编辑器(例如 ColorEditorFileNameEditor),也仍然必须创建代理与对象以及客户端与服务器之间的通信,因为你提供了一种新的 UI 类类型以在 Visual Studio 上下文中显示。 但是,在 Visual Studio 中实现该类型编辑器的代码要简单得多。

重要

详细描述此方案的文档正在编写中。 在该文档发布之前,请使用以下博客文章和示例来指导你创建、发布和使用此项目结构: