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


Конструктор изменяется после платформа .NET Framework (Windows Forms .NET)

Visual Designer для Windows Formдля .NET имеет некоторые улучшения и изменения с момента платформа .NET Framework. Эти изменения в значительной степени влияют на пользовательские конструкторы элементов управления. В этой статье описываются основные отличия от платформа .NET Framework.

Visual Studio — это приложение на основе платформа .NET Framework, поэтому визуальный конструктор, который вы видите для WindowsForm, также основан на платформа .NET Framework. С помощью проекта платформа .NET Framework среда Visual Studio и приложение WindowsForm, разработанные, выполняются в одном процессе: devenv.exe. Это создает проблему при работе с приложением FormWindows .NET (не платформа .NET Framework). Код .NET и платформа .NET Framework не могут работать в одном процессе. В результате Windows Forms .NET использует другой конструктор, конструктор вне процесса.

Внепроцессный конструктор

Внепроцессный конструктор — это процесс с именем DesignToolsServer.exe, который выполняется вместе с devenv.exe процессом Visual Studio. Процесс DesignToolsServer.exe выполняется в той же версии и платформе .NET, что приложение настроено для целевого объекта, например .NET 7 и x64.

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

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

Для .NET конструкторы элементов управления должны быть закодированы с помощью API, доступной Microsoft.WinForms.Designer.SDK в 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 пространство имен.
  • Типы, связанные с поведением, такие как украшения и оснастки, в System.Windows.Forms.Design.Behavior пространстве имен перемещены в Microsoft.DotNet.DesignTools.Designers.Behaviors пространство имен.

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

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

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

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

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

Внимание

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