Общие сведения о службе расширения функциональности
Обновлен: Ноябрь 2007
BehaviorService управляет пользовательским интерфейсом в конструкторе. Она предлагает универсальный способ управления элементами пользовательского интерфейса, например связанными с мышью событиями, командами меню и операциями перетаскивания OLE во время разработки.
Управление пользовательским интерфейсом во время разработки
Ключевой аспект индивидуализации работы во время разработки заключается в управлении пользовательским интерфейсом. Чтобы задать особые режимы работы пользовательского элемента управления во время разработки, создайте пользовательский конструктор.
Разработчик конструктора может создать собственные слои пользовательского интерфейса, называемые декоративными элементами. На поверхности каждого слоя создаются собственные типы Glyph для рисования, перетаскивания и других описаний пользовательского интерфейса. Каждый тип Glyph может иметь связанный тип Behavior. Behavior — это класс, который содержит перегрузки для всех средств ввода данных пользователем, включая команды меню, движения мыши и операции перетаскивания OLE. Объект Behavior также можно добавить независимо от объекта Glyph, чтобы включить их в общий набор средств ввода данных пользователем для всего конструктора. Все три ранее упомянутые функции реализуются посредством типа Behavior.
В .NET Framework версии 1.1 некоторые события, например OnMouseDragBegin, предоставлялись классом ControlDesigner. В данной модели большая часть логики конструктора пользовательского интерфейса была реализована в EventHandler. Поскольку на элементе управления присутствуют несколько специальных областей, которыми пользователь может управлять, данная модель требует большого объема дополнительной логики.
Именно для такой ситуации предназначен тип Behavior. Служба BehaviorService состоит из двух частей. Эти части и их описание приведены в следующей таблице:
Часть |
Описание |
---|---|
Стек классов Behavior |
Каждый класс имеет методы, относящиеся к командам меню, операциям перетаскивания OLE, связанным с мышью событиям и т. д. Класс, расположенный в верхней части стека, является активным классом Behavior, при этом в Behavior направляются все вводимые пользователем данные. |
Adorner — это невидимый слой, расположенный между рабочей областью конструирования и пользователем. Adorner может содержать объекты Glyph, представляющие собой объекты с упрощенной визуализацией. С помощью службы расширения функциональности для Glyph может быть выполнена проверка нажатия, кроме того, может предоставляться объект Behavior, который становится активным классом Behavior до тех пор, пока Glyph не выдаст значение true для проверки нажатия. |
Пока Конструктор Windows Forms поддерживает исходные переопределения ControlDesigner для перетаскиваний и движений мыши, эти действия реализуются как объекты Behavior. В следующей таблице приведены элементы в конструкторе для простого элемента управления, обладающего обычным набором маркеров переноса:
Элемент расширения функциональности |
Описание |
---|---|
Декоративный элемент выбора |
Один слой оформления обрабатывает все объекты Glyph выбора для пользовательского интерфейса. |
Глиф основной части |
Полностью прозрачный глиф Glyph основной части располагается поверх элемента управления. Его объект Behavior обрабатывает все операции с мышью. |
Глиф захвата |
Объекты захвата Glyph отображают для элемента управления маркеры захвата. Их объекты Behavior управляют операциями перетаскивания. |
Расширение пользовательского интерфейса во время разработки
Модель BehaviorService позволяет легко наложить на существующий пользовательский интерфейс конструктора новые функциональные элементы. Новый пользовательский интерфейс остается независимым от заданных ранее объектов Glyph и Behavior. Например, для доступа к смарт-тегам на некоторых элементах управления используется глиф Glyph, расположенный в верхнем правом углу элемента управления ().
Код смарт-тега создает собственный слой Adorner и добавляет на него объекты Glyph. Это позволяет отделить объекты Glyph смарт-тегов от объектов Glyph выбора. Необходимый код для добавления нового слоя Adorner в коллекцию Adorners достаточно прост:
behaviorService = (BehaviorService)serviceProvider.GetService(typeof(BehaviorService));
designerActionAdorner = new Adorner();
behaviorService.Adorners.Add(designerActionAdorner);
Glyph dag = new DesignerActionGlyph(/*...*/);
designerActionAdorner.Glyphs.Add(dag);
Глифы и расширения функциональности
Тип Glyph является простым. Если требуется сложная функциональность, добавьте ее в собственный класс, производный от Glyph.
Объекты Glyph могут иметь объекты Behavior, но это не является обязательным требованием. Glyph без объектов Behavior имеет свойство Behavior, возвращающее значение null.
Behavior содержит метод для каждого поддерживаемого взаимодействия с пользователем. Например, базовый класс Behavior содержит методы, поддерживающие такие операции перетаскивания, как OnDragEnter и OnGiveFeedback.
Большинство методов возвращает логическое значение, указывающее, была ли выполнена обработка события. События перетаскивания имеют значение в параметре DragEventArgs. Отдельные элементы меню можно добавлять или удалять, возвращая их из метода FindCommand. Метод FindCommand используется совместно со свойством DisableAllCommands, чтобы определить способ взаимодействия объектов MenuCommand с данным расширением функциональности.
Декоративные элементы
Объект Adorner может просматриваться как прокси между элементами, связанными с пользовательским интерфейсом и включающими объекты Glyph и BehaviorService.
Каждый объект Adorner можно включить и отключить. Только включенные объекты Adorner будут получать проверку нажатия и сообщения рисования от BehaviorService.
Когда объект Adorner добавляется в коллекцию BehaviorServiceAdornerCollection службы BehaviorService, коллекция задает свойство BehaviorService, чтобы Adorner мог выполнить обратный вызов в BehaviorService.
Вызов метода Invalidate объекта Adorner принуждает связанную службу BehaviorService обновить окно Adorner.
Расширения функциональности при принудительной отправке
Самым простым способом для добавления объектов Behavior в стек расширений функциональности является использование объектов Glyph, но этот способ не является единственным. Сами объекты Glyph могут принудительно отправлять объекты Behavior в стек расширений функциональности, кроме того, пользователь может выполнить принудительную отправку объектов Behavior непосредственно в стек расширений функциональности. Рассмотрим случай, когда необходимо перетащить маркер захвата по рабочей области конструирования. Пользователю не нужно создавать логику, отслеживающую пользовательскую операцию перетаскивания: объект Glyph самостоятельно выполняет со стеком расширений функциональности указанную ниже последовательность действий.
Объект Glyph имеет связанный с ним объект Behavior, реагирующий на жест нажатия кнопки мыши.
При нажатии кнопки мыши объект Glyph принудительно отправляет в стек расширений функциональности новый объект Behavior. Таким образом, Behavior обрабатывает события перемещения мыши и отпускания кнопки мыши. При этом также могут отключаться все команды меню, чтобы предотвратить использование сочетаний клавиш или других команд во время перетаскивания.
При отпускании кнопки мыши объект Behavior завершает жест перемещения и выводит себя из стека расширений функциональности. При этом автоматически восстанавливается предыдущий объект Behavior.
Примечание. |
---|
Архитектура BehaviorService связана с моделью Windows Forms и поэтому не поддерживает другие технологии отображения, например Web Forms. |