Поделиться через


Изменения в дизайнере с момента .NET Framework

Visual Designer для Windows Forms для .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, который выполняется вместе с процессом devenv.exe Visual Studio. Процесс DesignToolsServer.exe выполняется в той же версии и на той же платформе .NET, на которую настроено ваше приложение, например .NET 9 и x64.

В конструкторе Visual Studio прокси-объекты .NET Framework создаются для каждого компонента и управления, которые связаны с реальными объектами .NET из проекта в дизайнере DesignToolsServer.exe.

Конструкторы элементов управления

Для .NET дизайнеры элементов управления должны быть закодированы с использованием Microsoft.WinForms.Designer.SDK API, доступной в NuGet. Эта библиотека представляет собой рефакторинг дизайнеров .NET Framework для новой платформы .NET. Все типы конструктора перемещены в разные пространства имен, но имена типов в основном одинаковы. Чтобы обновить конструкторы платформы .NET Framework для .NET, необходимо слегка скорректировать пространства имен.

  • Классы конструктора и другие связанные типы, такие как ControlDesigner и ComponentTray, перемещены из System.Windows.Forms.Design пространства имен в Microsoft.DotNet.DesignTools.Designers пространство имен.
  • Типы, связанные со списком действий в пространстве имен System.ComponentModel.Design, перемещены в пространство имен Microsoft.DotNet.DesignTools.Designers.Actions.
  • Типы, связанные с поведением, такие как "adorners" и "snaplines", в System.Windows.Forms.Design.Behavior пространстве имен были перемещены в Microsoft.DotNet.DesignTools.Designers.Behaviors пространство имен.

Редакторы пользовательских типов

Редакторы пользовательских типов сложнее, чем конструкторы элементов управления. Так как процесс Visual Studio основывается на платформе .NET Framework, любой пользовательский интерфейс, отображаемый в контексте Visual Studio, также должен основываться на платформе .NET Framework. Эта конструкция представляет проблему, например при создании элемента управления .NET, отображающего редактор пользовательского типа, вызываемого нажатием кнопки в сетке свойств. Диалоговое окно не может отображаться в контексте Visual Studio.

Конструктор вне процесса обрабатывает большинство возможностей конструктора элементов управления, таких как адорнеры, встроенные редакторы типов и пользовательская отрисовка. В любое время, когда вам нужно показать настраиваемое модальное диалоговое окно, например, отобразить новый редактор типов, необходимо воспроизвести это взаимодействие клиент-сервер с использованием прокси-объекта, которое предоставляет внепроцессный конструктор. Это создает гораздо больше накладных расходов, чем старая система .NET Framework.

Если свойства пользовательского элемента управления используют редакторы типов, предоставляемые Windows Forms, можно использовать EditorAttribute для пометки свойств соответствующим редактором платформы .NET Framework, который Visual Studio должен использовать. Используя встроенные редакторы, вы избегаете необходимости репликации взаимодействия клиент-сервер через прокси-объект, предоставляемого внепроцессным дизайнером.

[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: Проект Windows Forms для платформа .NET Framework, содержащий диалоговые окна пользовательского интерфейса конструктора.
  • Control.Server: проект Windows Forms для .NET, содержащий кастомный код дизайнера для ваших элементов управления.
  • ** Control.Protocol: проект .NET Standard, содержащий классы связи, используемые как проектом Control.Client, так и проектом Control.Server.
  • Control.Package: проект пакета NuGet, содержащий все остальные проекты. Этот пакет имеет формат, позволяющий инструментам Visual Studio Windows Forms для .NET размещать и использовать вашу библиотеку элементов управления и конструкторов.

Даже если редактор типов является производным от существующего редактора, например ColorEditor или FileNameEditor, вам по-прежнему нужно создать взаимодействие с клиентом-сервером прокси-объекта, так как вы предоставили новый тип класса пользовательского интерфейса, который вы хотите отобразить в контексте Visual Studio. Однако код для реализации редактора типов в Visual Studio гораздо проще.

Это важно

Документация, подробно описывающая этот сценарий, находится в процессе разработки. Пока эта документация не будет опубликована, используйте следующую запись блога и пример для создания, публикации и использования этой структуры проекта: