Сравнение структуры конструктора Windows Forms со структурой конструктора WPF
Обновлен: Ноябрь 2007
Архитектура 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 (конструктор) метаданные конструктора добавляются в отдельную сборку, физически разрывая связь с реализацией времени выполнения. Эта свобода означает, что разные инструменты могут представить совершенно различные возможности конструктора для одного и того же типа времени выполнения. Дополнительные сведения см. в разделе Хранилище метаданных.
Объектная модель редактирования
В структуре System.ComponentModel пользовательские конструкторы получают доступ к элементам управления способом поздней привязки через класс PropertyDescriptor. Данное правило не применяется принудительно средой разработки, и, если разработчик забывает получить доступ к элементу управления с помощью класса PropertyDescriptor, возникает ошибка.
В структуре WPF (конструктор) пользовательские конструкторы взаимодействуют с элементами управления времени выполнения через объектную модель редактирования. Эта модель обеспечивает уровень косвенного обращения, в результате которого элементы управления абстрагируются в модель и представление. Эта объектная модель избавляет от необходимости получения доступа к элементам управления с помощью класса PropertyDescriptor.
Сходство со структурой конструктора ComponentModel
Контекст редактирования является основой для WPF (конструктор). Класс EditingContext содержит контекстное состояние конструктора.
Понятие контекста редактирования подобно интерфейсу IDesignerHost в пространстве имен System.ComponentModel.Design. Интерфейс IDesignerHost определяет множество функций в своем интерфейсе, но класс EditingContext предназначен только для данных и функций поведения.
Контекст редактирования предоставляет службы способом, похожим на интерфейс IServiceContainer. Контекст редактирования поддерживает перечисление и не поддерживает удаление служб после их добавления. Дополнительные сведения см. в разделе Архитектура контекста редактирования.
Различия в использовании атрибутов
Атрибуты конструктора имеют различные значения в архитектурах WPF (конструктор) и Windows Forms. В следующей таблице описаны различия использования связанных с конструктором атрибутов в двух структурах.
Атрибут |
Окно свойств Windows Forms |
Окно свойств конструктора WPF и инспектор свойств Expression Blend |
---|---|---|
Задает значение, которое нужно передать свойству, чтобы это свойство получило значение из другого источника. Это называется окружением. |
Не определено |
|
Указывает, следует ли отображать свойство или событие в окне «Свойства». |
Указывает, следует ли отображать свойство или событие в окне «Свойства». Если явно задано значение true свойства, которое обычно не отображается, это свойство будет отображаться. |
|
Задает имя категории, в которой при отображении в элементе управления PropertyGrid для группировки свойств или событий установлен режим «По категориям». |
Задает имя категории для группировки свойств при отображении в окне «Свойства». |
|
Задает для свойства значение по умолчанию. |
Для типов данных CLR присваивает свойству значение по умолчанию. Игнорируется в свойствах зависимостей. |
|
Задает описание свойства или события. |
Не определено |
|
Задает отображаемое имя свойства, события или открытого метода «void», не принимающего аргументов. |
Задает имя, которое будет отображаться в окне «Свойства» для свойства, к которому применяется этот атрибут. |
|
Задает редактор, используемый для изменения свойства. |
Задает редактор, используемый для изменения свойства, включая редакторы категорий, содержащих несколько свойств. |
|
Не определено |
Значение EditorBrowsableState.Advanced переводит редактор категорий или свойство в дополнительный расширитель. |
|
Указывает зарезервированное ключевое слово контекста для класса или члена. |
Не определено |
|
Определяет, должно ли быть локализовано свойство. |
Не определено |
|
Показывает, что текстовое представление объекта скрывается такими знаками, как звездочка. |
Не определено |
|
Указывает, доступно ли свойство, с которым связан данный атрибут, только для чтения или для чтения и записи во время разработки. |
Указывает, доступно ли свойство, с которым связан данный атрибут, только для чтения или для чтения и записи во время разработки. Свойства, помеченные атрибутом ReadOnlyAttribute, будут отображать объект «только для чтения» для редактора строк в инспекторе свойств. |
|
Показывает, что следует обновить окно «Свойства» при изменении значения связанного свойства. |
Не определено |
|
Указывает, какой тип использовать в качестве преобразователя для объекта, с которым связан этот атрибут. |
Указывает, какой тип использовать в качестве преобразователя для объекта, с которым связан этот атрибут. |
|
Задает для компонента событие по умолчанию. |
Задает событие по умолчанию для компонента, определяющий обработчик событий, который должен быть создан при двойном щелчке. |
|
Задает для компонента свойство по умолчанию. |
Задает свойство по умолчанию для компонента, который определяет, какое свойство выбрано по умолчанию. |
|
Задает класс, используемый для реализации служб времени разработки для компонента. |
Не определено |
|
Указывает, что конструктор для класса принадлежит к определенной категории. |
Не определено |
|
Представляет атрибут элемента панели элементов. |
Не определено |
|
Задает строку фильтра и тип фильтра, которые должны использоваться для панели элементов. |
Не определено |
|
Не определено |
Используется для запрещения отображения типа в панели элементов, когда сборка проверяется на наличие типов для добавления на панель элементов. |
|
Не определено |
Используется для указания элементов, добавляемых в комбинированное поле для редактора коллекции или для редактора вспомогательных свойств. Разрешает указывать фабрику для настройки создания элементов. |
|
Не определено |
Используется для указания порядка, согласно которому свойства будут отображаться в окне «Свойства». |
Следующие атрибуты используются в WPF (конструктор), но не в конструкторе Windows Forms Designer.
Различия в определении значков панели элементов
В конструкторе Windows Forms Designer значок панели элементов для пользовательского элемента управления задается путем применения атрибута ToolboxBitmapAttribute к классу элемента управления.
В WPF (конструктор) для указания точечного рисунка для панели элементов используется встроенный ресурс и соглашение об именовании. Кроме того, используется атрибут ToolboxBrowsableAttribute для ограничения типов в сборке, доступных для заполнения панели элементов.
Различия в определении метаданных
В Windows Forms метаданные конструктора задаются декларативно с помощью применения таких атрибутов, как DesignerAttribute.
В архитектуре WPF (конструктор) метаданные конструктора определяются в хранилище метаданных. Дополнительные сведения см. в разделе Хранилище метаданных.
См. также
Другие ресурсы
Расширяемость среды конструктора WPF