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

Конструктор WPF для Visual Studio — это визуальная среда редактирования для элементов WPF и Silverlight. сред. Конструктор WPF основан на платформе с расширяемой архитектурой, которую можно расширить для создания собственных пользовательских возможностей разработки.

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

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

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

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

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

Пример реализации персонализированной среды разработки для WPF и Visual Studio см. в разделе Пошаговое руководство. Создание графического элемента времени разработки

Примеры кода, демонстрирующие реализацию пользовательского взаимодействия при разработке для WPF и Silverlight см. в разделе WPF Designer Extensibility Samples.

Инфраструктура конструктора WPF

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

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

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

Описание

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

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

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

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

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

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

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

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

Метаданные времени разработки

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

На следующей иллюстрации представлены функциональные блоки платформы сред. Конструктор WPF.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Метаданные времени разработки

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

Для определения сборки, обеспечивающей реализацию времени разработки, необходимо отметить сборку с помощью объекта ProvideMetadataAttribute и ввести класс, реализующий интерфейс IProvideAttributeTable.

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

Поддержка времени разработки в Expression Blend

сред. Конструктор WPF поддерживает все функции в платформе расширяемости. Expression Blend поддерживает следующие функции.

  • Декоративные элементы

  • Контекстные меню

  • DesignModeValueProvider

  • Инициализаторы по умолчанию

  • Все функции ModelItem, например выделение и обработка

  • Расширяемость окна "Свойства"

Expression Blend не поддерживает классы ParentAdapter и PlacementAdapter.

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

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

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

Закрытые и уникальные для конструктора сборки определяют набор возможностей средства сред. Конструктор WPF и их взаимодействия с конструкторами, например Visual Studio и Expression Blend.

Конструкторы WPF и Silverlight устанавливаются как единое целое. Не существует отдельных пакетов для каждого из конструкторов.

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

Сборка

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

Описание

Microsoft.Windows.Design.Extensibility.dll

Да

Предоставляет модель расширяемости с помощью атрибутов и логики интеграции пакета SDK Visual Studio.

Microsoft.Windows.Design.Interaction.dll

Да

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

Microsoft.Windows.Design.Markup.dll

Нет

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

Microsoft.VisualStudio.XAML.dll

Нет

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

Microsoft.Windows.Design.Host.dll

Нет

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

Microsoft.Windows.Design.Developer.dll

Нет

Реализация сред. Конструктор WPF.

Microsoft.Windows.Design.Developer.WPF.dll

Нет

Microsoft.Windows.Design.Developer.Silverlight.dll

Нет

Microsoft.Windows.Design.Platform.dll

Нет

Уровень платформы с абстрактными классами. Реализация абстрактных классов в данной сборке.

Microsoft.Windows.Design.Platform.WPF.dll

Нет

Уникальное для платформы время разработки в WPF.

Microsoft.Windows.Design.Platform.Silverlight.dll

Нет

Уникальное для платформы время разработки в Silverlight.

Microsoft.Expression.DesignModel.dll

Нет

Сборка времени разработки в Expression Blend.

Microsoft.Expression.Platform.WPF.dll

Нет

Сборка времени разработки в Expression Blend.

Microsoft.Expression.Platform.Silverlight.dll

Нет

Сборка времени разработки в Expression Blend.

Примечание

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

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

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

См. также

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

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

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

Предоставление метаданных времени разработки

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

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