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


Архитектура расширяемости конструктора WPF

Обновлен: Ноябрь 2007

Windows Presentation Foundation (WPF) для Visual Studio (конструктор) — это среда визуального редактирования для составных элементов управления WPF, которые реализуются посредством типа UserControl. WPF (конструктор) основан на платформе с расширяемой архитектурой, которую можно расширить для создания собственных пользовательских возможностей разработки.

Расширяя объектную модель WPF (конструктор), можно значительно настроить внешний вид и поведение содержимого WPF во время разработки. Ниже приведены примеры способов расширения WPF (конструктор).

  • Настройка перемещения и изменения размеров глифов с расширенной графикой.

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

  • Изменение внешнего вида и поведения элемента управления во время разработки в различных средствах.

Архитектура WPF (конструктор) поддерживает полный набор функций WPF. Это позволяет создавать множество возможностей визуального проектирования, которые ранее были недоступны.

Объектная модель конструктора WPF

Объектная модель WPF (конструктор) является модульной. Это означает, что при расширении среды времени разработки расширяются только элементы, необходимые для настраиваемых возможностей. Нет необходимости писать большое количества кода для поддержки пользовательских возможностей проектирования. 

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

Функциональная единица

Описание

Модель редактирования

Программный интерфейс для объектов в конструкторе.

Поставщики функций

Основная точка расширения в структуре конструктора.

Контекст редактирования

Центральное хранилище состояния конструктора.

Средства

Средства для обработки входных данных пользователя.

Хранилище метаданных

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

На следующем рисунке показана объектная модель WPF (конструктор).

Модель объекта высокого уровня

Bb514646.alert_note(ru-ru,VS.90).gifПримечание.

WPF (конструктор) поддерживает структуру полностью расширяемой среды. Версия Expression Blend поддерживает только редакторы свойств, загрузку метаданных и лицензирование. Версия Blend не поддерживает действия меню и графические элементы. 

Модель редактирования

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

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

Класс ModelService предоставляет точку входа для модели редактирования и глобальных уведомлений о событиях.

Класс ViewService сопоставляет визуальные представления с элементами базовой модели.

Обе службы необходимы для работы конструктора. Для класса DesignerView, который отвечает за обработку ввода данных пользователем и направление их командам, требуется, чтобы обе эти службы точно сопоставляли пользовательский ввод с моделью.

Поставщики функций

Поведение типов во время разработки расширяется с помощью класса FeatureProvider или FeatureConnector<FeatureProviderType>. Класс FeatureConnector<FeatureProviderType> управляет списком объектов FeatureProvider.

Класс FeatureProvider обеспечивает основную точку расширения. Поставщик функций представляет собой простую функцию или надстройку, которая обычно не предъявляет много требований к среде разработки и создается и уничтожается в заданном контексте. Поставщики функций используются для добавления новых фрагментов пользовательского интерфейса на поверхность разработки или для изменения основного поведения. Например, поставщик функций может добавить несколько скоб захвата или предоставить новый тип поведения перетаскивания мышью.

Чтобы получить доступ к самому нижнему уровню расширяемости, необходимо получить производный класс от класса FeatureConnector<FeatureProviderType>. Этот класс предоставляет поставщик служб, с помощью которого производные классы соединительных элементов могут обрабатывать события и запросы и публиковать службы. Например, можно реализовать соединительный элемент для предоставления пользовательского интерфейса выделения или сериализации для конкретного объекта.

В общем случае реализация функции осуществляется для расширения существующих понятий. Соединительный элемент реализуется для предоставления новых понятий. Дополнительные сведения см. в разделе Поставщики функций и соединительные элементы.

Контекст редактирования

в выполняющемся конструкторе накапливается значительное количество информации о состоянии. Например, состояние конструктора может включать сведения о том, какие объекты выбраны или какое поведение должно реализовываться при нажатии левой кнопки мыши. Состояние конструктора хранится в центральном расположении, чтобы при необходимости его можно было найти. Класс EditingContext представляет центральный репозиторий состояний конструктора.

Класс EditingContext разделяет состояние на две категории: данные и поведение. Данные хранятся в виде таблицы элементов контекста, а поведение хранится в виде таблицы служб. Обе таблицы индексируются ключом на основе типа и являются перечислимыми.

Класс ContextItem содержит одно состояние в конструкторе. Элементы контекста являются неизменяемыми, но для имитации изменения новые элементы контекста могут заменять существующие.

Службы доступны через свойство «Services», которое возвращает экземпляр ServiceManager, а элементы контекста доступны через свойство «Items», которое возвращает экземпляр ContextItemManager.

Команды, задачи и средства

Архитектура средств WPF (конструктор) состоит из команд, задач и инструментов. 

Команда — это уникальный идентификатор, представляющий поведение. Например, «Cut» является командой, обозначающей вырезание текущего текста и добавление его в буфер обмена. Код, реализующий команду «Cut», зависит от приложения и даже меняется внутри приложения. Например, вырезание текста в документе Word реализовано иначе, чем вырезание текста в текстовом поле поиска того же документа. Вне зависимости от реализации команда «Cut» остается постоянной.

WPF (конструктор) расширяет систему команд WPF посредством введения понятия команды средства. Команда средства реализует интерфейс ICommand и подобна классу RoutedCommand.

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

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

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

Хранилище метаданных

В WPF (конструктор) метаданные, определяющие поведение элемента управления в режиме разработки, добавляются в отдельную сборку, которая называется хранилищем метаданных. В .NET Framework 3.5 хранилище метаданных реализовано в виде таблицы атрибутов, основанных на коде, с внешним XML-файлом, ссылающимся на код и профиль конструктора. Различные средства могут обеспечить различные хранилища метаданных с совершенно разными реализациями конструктора. Это разделяет поведение времени выполнения и времени разработки так, что можно изменять конструктор отдельно от элемента управления. Дополнительные сведения см. в разделе Хранилище метаданных.

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

В следующих шагах описывается создание экземпляра типа конструктора с помощью среды WPF (конструктор). В этом вымышленном примере показано, как гипотетический разработчик может выбрать один элемент управления «кнопка» на поверхности разработки.

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

  2. Среда разработки составляет основанный на XML список сопоставлений функция-тип.

  3. Среда разработки добавляет пользовательские метаданные в эти типы с помощью класса TypeDescriptor. Например, поставщик GrabHandleProvider может быть связан со всеми типами UIElement, включая производные типы.

  4. Фабрика редактирования создает хранилище редактирования, контекст и диспетчер функций и заполняет хранилище редактирования.

  5. WPF (конструктор) перечисляет все объекты UIElement, которые предоставляются хранилищем редактирования, и вызывает метод InitializeFeatures для каждого из этих объектов.

    1. Предположим, что в данной иерархии объявлен элемент Button.

    2. Диспетчер FeatureManager выполняет поиск атрибутов FeatureAttribute в кнопке. Диспетчер FeatureManager обнаруживает в кнопке атрибут FeatureAttribute типа GrabHandleProvider.

    3. Диспетчер FeatureManager продолжает поиск типа GrabHandleProvider и обнаруживает связанный с ним атрибут FeatureConnectorAttribute. Атрибут FeatureConnectorAttribute задает объект SelectionConnector.

    4. Диспетчер FeatureManager определяет, что этот узел еще не существует. Диспетчер FeatureManager создает объект SelectionConnector и добавляет его в список узлов активных функций.

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

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

  7. Объект SelectionConnector получает данное уведомление и создает все основанные на выделении экземпляры FeatureProvider, связанные с выбранным объектом, включая экземпляр GrabHandleProvider.

  8. SelectionConnector запрашивает у типа GrabHandleProvider список графических элементов и добавляет их на уровень графического элемента. Скобы захвата появляются вокруг выделенной кнопки.

Сборки конструктора WPF

WPF (конструктор) состоит из нескольких сборок, относящихся к одной из трех категорий: открытые, закрытые и уникальные для Visual Studio.

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

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

Assembly

Открытый интерфейс API

Описание

Microsoft.VisualStudio.XAML.dll

Нет

Логика интеграции Visual Studio SDK

Microsoft.Windows.Design.Host.dll

Есть

Открытый API для главного конструктора (уникальный для Visual Studio)

Microsoft.Windows.Design.Developer.dll

Нет

Реализация WPF (конструктор). Единственным открытым интерфейсом API является таблица атрибутов.

Microsoft.Windows.Design.Core.dll

Есть

Предоставляет основу для любого конструктора при помощи объединительной панели служб и данных, а также обработки метаданных. Это единственная сборка, поддерживаемая Expression Blend.

Microsoft.Windows.Design.Extensibility.dll

Есть

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

Microsoft.Windows.Design.Interaction.dll

Есть

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

Microsoft.Windows.Design.Markup.dll

Есть

Предоставляет код XAML и механизмы модели документов.

Bb514646.alert_note(ru-ru,VS.90).gifПримечание.

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

Архитектура конструктора WPF и конструктора Windows Forms Designer

Архитектура WPF (конструктор) значительно отличается от архитектуры конструктора Windows Forms Designer, которая характеризуется интерфейсом IComponent и пространством имен System.ComponentModel. Дополнительные сведения см. в разделе Сравнение структуры конструктора Windows Forms со структурой конструктора WPF

См. также

Основные понятия

Поставщики функций и соединительные элементы

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

Создание элементов управления Windows Forms во время разработки

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