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


Поддержка времени разработки Visual Studio для пользовательских элементов управления

Как вы заметили при взаимодействии с конструктором Windows Forms, существует множество различных функций времени разработки, предлагаемых элементами управления Windows Forms. Некоторые функции, предлагаемые конструктором Visual Studio, включают строки привязки, элементы действий и сетку свойств. Все эти функции предоставляют более удобный способ взаимодействия и настройки элемента управления во время разработки. В этой статье представлен обзор того, какую поддержку вы можете добавить в пользовательские элементы управления, чтобы обеспечить удобство разработки для потребителей элементов управления.

Что отличается от платформа .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 9 и x64, в .NET, на которую нацелено ваше приложение. Когда пользовательский элемент управления должен отображать пользовательский интерфейс в Visual Studio, пользовательский элемент управления должен реализовать архитектуру клиентского сервера, чтобы упростить взаимодействие с devenv.exe. Дополнительные сведения см. в разделе Изменения, внесенные дизайнером с момента.NET Framework.

Окно свойств

В окне свойств Visual Studio отображаются свойства и события выбранного элемента управления или формы. Обычно это первая точка настройки, выполняемая на пользовательском элементе управления или компоненте.

На следующем рисунке показан элемент управления Button, выбранный в визуальном конструкторе, и сетка свойств с свойствами кнопки:

Конструктор Windows Forms в Visual Studio с кнопкой и окном свойств

Вы можете контролировать некоторые аспекты отображения сведений о пользовательском элементе управления в сетке свойств. Атрибуты применяются либо к пользовательским свойствам класса элемента управления, либо к свойствам класса.

Атрибуты для классов

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

Свойство Описание
DefaultEventAttribute Указывает событие по умолчанию для компонента.
DefaultPropertyAttribute Указывает свойство по умолчанию для компонента.
DesignerAttribute Задает класс, используемый для реализации служб времени разработки для компонента.
DesignerCategoryAttribute Указывает, что конструктор класса принадлежит определенной категории.
ToolboxItemAttribute Представляет атрибут элемента панели элементов.
ToolboxItemFilterAttribute Указывает строку фильтра и тип фильтра, используемый для элемента панели элементов.

Атрибуты для свойств

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

Свойство Описание
AmbientValueAttribute Указывает значение, передаваемое свойству, чтобы вызвать получение свойства из другого источника. Это называется атмосфера.
BrowsableAttribute Указывает, должно ли отображаться свойство или событие в окне свойств .
CategoryAttribute Указывает имя категории, в которой следует сгруппировать свойство или событие при отображении в элементе управления PropertyGrid в режиме Categorized.
DefaultValueAttribute Указывает значение по умолчанию для свойства.
DescriptionAttribute Указывает описание свойства или события.
DisplayNameAttribute Указывает отображаемое имя свойства, события или общедоступного метода, который не возвращает значение и не принимает аргументы.
EditorAttribute Задает редактор, используемый для изменения свойства.
EditorBrowsableAttribute Указывает, что свойство или метод можно просматривать в редакторе.
HelpKeywordAttribute Указывает ключевое слово контекста для класса или члена.
LocalizableAttribute Указывает, следует ли локализовать свойство.
PasswordPropertyTextAttribute Указывает, что текстовое представление объекта скрыто символами, такими как звездочки.
ReadOnlyAttribute Указывает, является ли свойство, к которому привязан этот атрибут, доступным только для чтения или для чтения и записи во время разработки.
RefreshPropertiesAttribute Указывает, что сетка свойств должна обновляться при изменении значения связанного свойства.
TypeConverterAttribute Указывает тип, используемый в качестве преобразователя для объекта, с которым привязан этот атрибут.

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

Взаимодействие с пользовательскими элементами управления во время разработки может быть улучшено путем создания связанного пользовательского конструктора. По умолчанию пользовательский элемент управления отображается на поверхности конструктора узла, и он выглядит так же, как и во время выполнения. С помощью пользовательского конструктора можно улучшить представление элемента управления во время разработки, добавить элементы действия, строки привязки и другие элементы, которые могут помочь пользователю определить способ размещения и настройки элемента управления. Например, во время ToolStrip разработки конструктор добавляет дополнительные элементы управления для добавления, удаления и настройки отдельных элементов, как показано на следующем рисунке:

Конструктор Windows Forms в Visual Studio, показывающий представление времени разработки разбиения контейнера.

Вы можете создать собственные пользовательские конструкторы, выполнив следующие действия.

  1. Добавление ссылки на пакет NuGet Microsoft.WinForms.Designer.SDK.
  2. Создание типа наследует от Microsoft.DotNet.DesignTools.Designers.ControlDesigner класса.
  3. В классе пользовательского элемента управления пометьте класс атрибутом System.ComponentModel.DesignerAttribute класса, передав тип, созданный на предыдущем шаге.

Дополнительные сведения см. в разделе "Что отличается от платформа .NET Framework".

Поручения

Действия конструктора — это контекстно-чувствительные меню, которые позволяют пользователю быстро выполнять распространенные задачи. Например, если вы добавите TabControl в форму, вы добавите вкладки в элемент управления и удалите их из него. Вкладки управляются в окне "Свойства " через TabPages свойство, в котором отображается редактор коллекции вкладок. Вместо того чтобы пользователь всегда просматривал список свойств в поиске свойства TabPages, TabControl предоставляет кнопку смарт-тега, которая видна только при выборе элемента управления, как показано на следующих изображениях.

Конструктор Windows Forms в Visual Studio с кнопкой смарт-тега элемента управления вкладкой.

При выборе смарт-тега отображается список действий:

Конструктор Windows Forms в Visual Studio показывает нажатую кнопку смарт-тега элемента управления вкладки, которая отображает список действий.

Добавив действия "Добавить вкладку " и "Удалить вкладку ", конструктор элемента управления делает его таким образом, чтобы можно было быстро добавить или удалить вкладку.

Создание списка элементов действия

Списки элементов действия предоставляются созданным типом ControlDesigner . Ниже приведены основные инструкции по созданию собственного списка действий.

  1. Добавление ссылки на пакет NuGet Microsoft.WinForms.Designer.SDK.
  2. Создание нового класса списка действий, наследуемого от Microsoft.DotNet.DesignTools.Designers.Actions.DesignerActionList.
  3. Добавьте свойства в список действий, к которому требуется доступ пользователя. Например, добавление bool свойства или Boolean (в Visual Basic) в класс создает CheckBox элемент управления в списке действий.
  4. Выполните действия, описанные в разделе "Конструкторы пользовательских элементов управления" , чтобы создать новый конструктор.
  5. В классе конструктора переопределите ActionLists свойство, которое возвращает Microsoft.DotNet.DesignTools.Designers.Actions.DesignerActionListCollection тип.
  6. Добавьте список действий в DesignerActionListCollection экземпляр и верните его.

Пример списка действий см . в репозитории документов и примеров GitHub конструктора Windows Forms, в частности в папке TileRepeater.Designer.Server/ControlDesigner .

В окне "Свойства" большинство свойств легко редактируются в сетке, например когда тип резервного свойства — перечисление, логическое значение или число.

Окно свойств Visual Studio для приложения Windows Forms с свойством выравнивания.

Иногда свойство является более сложным и требует пользовательского диалога, которое пользователь может использовать для изменения свойства. Например, Font это свойство является типом System.Drawing.Font , который содержит множество свойств, которые изменяют, как выглядит шрифт. Это не легко представить в окне свойств , поэтому это свойство использует настраиваемое диалоговое окно для редактирования шрифта:

Диалоговое окно шрифта Visual Studio для приложения Windows Forms.

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

При ссылке на встроенный редактор типов используйте тип платформа .NET Framework, а не тип .NET:

[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