设计器自 .NET Framework(Windows 窗体 .NET)以来发生更改

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

Visual Studio 是基于 .NET Framework 的应用程序,因此,针对Windows 窗体看到的可视化设计器也基于 .NET Framework。 使用 .NET Framework 项目,Visual Studio 环境和正在设计的Windows 窗体应用在同一进程中运行:devenv.exe。 使用 Windows 窗体 .NET(而不是 .NET Framework)应用时,这会带来问题。 .NET 和 .NET Framework 代码不能在同一进程中运行。 因此,Windows 窗体 .NET 使用不同的设计器“进程外”设计器。

进程外设计器

进程外设计器是一个名为 DesignToolsServer.exe 的进程,在 Visual Studio 的 devenv.exe 进程中运行。 DesignToolsServer.exe进程在应用已设置为目标的 .NET 版本和平台上运行,例如 .NET 9 和 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。 例如,在创建显示通过单击 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:一个 .NET Standard 项目,其中包含 Control.ClientControl.Server 项目使用的通信类。
  • Control.Package:包含所有其他项目的 NuGet 包项目。 此包采用一种允许 Visual Studio Windows 窗体用于 .NET 工具主机和使用控件库和设计器的方式进行格式化。

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

重要

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