Сравнение структуры конструктора Windows Forms со структурой конструктора WPF

Архитектура сред. Конструктор WPF значительно отличается от архитектуры конструктора Windows Forms Designer, которая характеризуется интерфейсом IComponent и пространством имен System.ComponentModel. Тот, кто создавал пользовательские реализации времени разработки для элементов управления Windows Forms, легко заметит, что архитектура сред. Конструктор WPF более проста в использовании и расширении.

Архитектура сред. Конструктор WPF сохраняет классы TypeConverter и TypeDescriptor из объектной модели конструктора Windows Forms Designer. Большинство других аспектов архитектуры сред. Конструктор WPF отличаются от прежней архитектуры. Дополнительные сведения об архитектуре времени разработки Windows Forms см. в разделе Расширение поддержки времени разработки.

Ключевые различия между структурой ComponentModel и структурой WPF

В следующей таблице приведены различия между архитектурой сред. Конструктор WPF и структурой System.ComponentModel.

Структура ComponentModel

Структура сред. Конструктор WPF

Основана на интерфейсах IComponent, IContainer и ISite.

Основана на классе FrameworkElement.

Базируется на службах времени разработки, предоставляемых узлом.

Конструкторы декларативно публикуют минимальные требования.

Выделенный тип конструктора для каждого типа элемента управления.

Любое число функций может работать с типом элемента управления.

Метаданные жестко запрограммированы для каждого типа элемента управления; метаданные зафиксированы во время компиляции элемента управления.

Метаданные развертываются в отдельной сборке; метаданные могут быть настроены или заменены инструментарием. Это позволяет обновлять метаданные времени разработки независимо от элемента управления.

Интерфейс IDesignerHost хранит состояние конструктора.

Класс EditingContext хранит состояние конструктора.

Службы собираются и совместно используются реализацией интерфейса IServiceContainer.

Класс EditingContext содержит ссылки на службы.

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

Архитектура средств сред. Конструктор WPF управляет клавиатурой, мышью и взаимодействиями команд.

Объектная модель редактирования состоит из элементов управления времени выполнения с получением доступа поздней привязки через класс PropertyDescriptor.

Объектная модель редактирования предоставляет слой косвенных обращений к абстрактным элементам управления времени выполнения. Редакторы категорий допускают редактирование нескольких свойств в одном пользовательском интерфейсе.

Интерфейс IComponent икласс FrameworkElement

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

Элементы WPF не реализуют интерфейс IComponent. Это является одной из основных причин, почему сред. Конструктор WPF не использует структуру System.ComponentModel. Это означает, что элементы управления WPF нигде не расположены. Таким образом, элементы управления WPF не могут запрашивать службы конструктора из среды разработки System.ComponentModel.

Службы времени разработки

Конструкторы в структуре System.ComponentModel запрашивают службы из среды разработки. В структуре сред. Конструктор WPF большинство задач можно завершить без вызова служб из среды.

В структуре System.ComponentModel не гарантируется наличие служб конструктора в узле конструктора; это означает, что пользовательский код конструктора должен всегда проверять наличие ссылки null после вызова метода GetService. При отсутствии службы код конструктора должен завершаться, и во многих случаях это ограничение не может быть выполнено.

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

Специальные типы конструктора и отделение метаданных

В структуре System.ComponentModel тип конструктора связан с соответствующим компонентом через атрибут метаданных DesignerAttribute. Это означает, что связь устанавливается во время компиляции, создавая жестко заданную зависимость между поведением компонента во время выполнения и во время разработки. Чтобы присоединить другой конструктор, необходимо изменить объявление DesignerAttribute и перекомпилировать базовый код компонента.

В сред. Конструктор WPF метаданные конструктора добавляются в отдельную сборку, физически разрывая связь с реализацией времени выполнения. Эта свобода означает, что разные инструменты могут представить совершенно различные возможности конструктора для одного и того же типа времени выполнения. Дополнительные сведения см. в разделе AttributeTable.

Объектная модель редактирования

В структуре System.ComponentModel пользовательские конструкторы получают доступ к элементам управления способом поздней привязки через класс PropertyDescriptor. Данное правило не применяется принудительно средой разработки, и, если разработчик забывает получить доступ к элементу управления с помощью класса PropertyDescriptor, возникает ошибка.

В структуре сред. Конструктор WPF пользовательские конструкторы взаимодействуют с элементами управления времени выполнения через объектную модель редактирования. Эта модель обеспечивает уровень косвенного обращения, в результате которого элементы управления абстрагируются в модель и представление. Эта объектная модель избавляет от необходимости получения доступа к элементам управления с помощью класса PropertyDescriptor.

Сходство со структурой конструктора ComponentModel

Контекст редактирования является основой для сред. Конструктор WPF. Класс EditingContext содержит контекстное состояние конструктора.

Понятие контекста редактирования подобно интерфейсу IDesignerHost в пространстве имен System.ComponentModel.Design. Интерфейс IDesignerHost определяет множество функций в своем интерфейсе, но класс EditingContext предназначен только для данных и функций поведения.

Контекст редактирования предоставляет службы способом, похожим на интерфейс IServiceContainer. Контекст редактирования поддерживает перечисление и не поддерживает удаление служб после их добавления. Дополнительные сведения см. в разделе Архитектура контекста редактирования.

Различия в использовании атрибутов

Атрибуты конструктора имеют различные значения в архитектурах сред. Конструктор WPF и Windows Forms. В следующей таблице описаны различия использования связанных с конструктором атрибутов в двух структурах.

Атрибут

Окно свойств Windows Forms

Окно свойств конструктора WPF и инспектор свойств Expression Blend

AmbientValueAttribute

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

Неприменимо

BrowsableAttribute

Указывает, следует ли отображать свойство или событие в окне "Свойства".

Указывает, следует ли отображать свойство или событие в окне "Свойства". Если явно задано значение true свойства, которое обычно не отображается, это свойство будет отображаться.

CategoryAttribute

Задает имя категории, в которой при отображении в элементе управления PropertyGrid для группировки свойств или событий установлен режим "По категориям".

Задает имя категории для группировки свойств при отображении в окне "Свойства".

DefaultValueAttribute

Задает для свойства значение по умолчанию.

Для типов данных CLR присваивает свойству значение по умолчанию. Игнорируется в свойствах зависимостей.

DescriptionAttribute

Задает описание свойства или события.

Неприменимо

DisplayNameAttribute

Задает отображаемое имя свойства, события или открытого метода "void", не принимающего аргументов.

Задает имя, которое будет отображаться в окне "Свойства" для свойства, к которому применяется этот атрибут.

EditorAttribute

Задает редактор, используемый для изменения свойства.

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

EditorBrowsableAttribute

Неприменимо

Значение EditorBrowsableState.Advanced переводит редактор категорий или свойство в дополнительный расширитель.

HelpKeywordAttribute

Указывает зарезервированное ключевое слово контекста для класса или элемента.

Неприменимо

LocalizableAttribute

Определяет, должно ли быть локализовано свойство.

Неприменимо

PasswordPropertyTextAttribute

Показывает, что текстовое представление объекта скрывается такими знаками, как звездочка.

Неприменимо

ReadOnlyAttribute

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

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

RefreshPropertiesAttribute

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

Неприменимо

TypeConverterAttribute

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

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

DefaultEventAttribute

Задает для компонента событие по умолчанию.

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

DefaultPropertyAttribute

Задает для компонента свойство по умолчанию.

Задает свойство по умолчанию для компонента, который определяет, какое свойство выбрано по умолчанию.

DesignerAttribute

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

Неприменимо

DesignerCategoryAttribute

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

Неприменимо

ToolboxItemAttribute

Представляет атрибут элемента панели элементов.

Неприменимо

ToolboxItemFilterAttribute

Задает строку фильтра и тип фильтра, которые должны использоваться для панели элементов.

Неприменимо

ToolboxBrowsableAttribute

Неприменимо

Используется для запрещения отображения типа в панели элементов, когда сборка проверяется на наличие типов для добавления на панель элементов.

NewItemTypesAttribute

Неприменимо

Используется для указания элементов, добавляемых в комбинированное поле для редактора коллекции или для редактора вспомогательных свойств. Разрешает указывать фабрику для настройки создания элементов.

PropertyOrderAttribute

Неприменимо

Используется для указания порядка, согласно которому свойства будут отображаться в окне "Свойства".

Следующие атрибуты используются в сред. Конструктор WPF, но не в конструкторе Windows Forms.

Различия в определении значков панели элементов

В конструкторе Windows Forms Designer значок панели элементов для пользовательского элемента управления задается путем применения атрибута ToolboxBitmapAttribute к классу элемента управления.

В сред. Конструктор WPF для указания точечного рисунка для панели элементов используется встроенный ресурс и соглашение об именовании. Кроме того, используется класс ToolboxBrowsableAttribute для ограничения типов в сборке, доступных для заполнения панели элементов.

Различия в определении метаданных

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

В архитектуре сред. Конструктор WPF метаданные конструктора определяются в AttributeTableх.

См. также

Другие ресурсы

Расширяемость среды конструктора WPF

Расширение поддержки времени разработки

Расширяемость среды конструктора WPF