Архитектура элемента управления ToolStrip

Классы ToolStrip и ToolStripItem классы предоставляют гибкую расширяемую систему для отображения панели инструментов, состояния и пунктов меню. Эти классы содержатся в пространстве имен System.Windows.Forms, и их имена обычно имеют префикс "ToolStrip" (например ToolStripOverflow) или суффикс "Strip" (например MenuStrip).

ToolStrip

В следующих разделах описываются ToolStrip и элементы управления, производные от него.

ToolStrip — это абстрактный базовый класс для MenuStrip, StatusStrip и ContextMenuStrip. Следующая объектная модель демонстрирует иерархию наследования ToolStrip.

Diagram that shows the ToolStrip object model.

Доступ ко всем элементам в ToolStrip можно получать с помощью коллекции Items. Доступ ко всем элементам в ToolStripDropDownItem можно получать с помощью коллекции DropDownItems. В классе, производном от ToolStrip, можно также использовать свойство DisplayedItems для доступа только к отображаемым в данный момент элементам. Это элементы, которые в текущий момент не находятся в дополнительном меню.

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

MenuStrip — это контейнер верхнего уровня, заменяющий MainMenu. Он также обеспечивает обработку ключей и функции многодокументного интерфейса (MDI). Функционально ToolStripDropDownItem и ToolStripMenuItem работают вместе с MenuStrip, хотя они являются производными от ToolStripItem.

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

StatusStrip

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

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

ContextMenuStrip

ContextMenuStrip заменяет собой ContextMenu. Вы можете связать ContextMenuStrip с любым элементом управления, а при его щелчке правой кнопкой мыши автоматически отображается контекстное меню. Вы можете отображать ContextMenuStrip программными средствами с помощью метода Show. ContextMenuStrip поддерживает допускающие отмены события Opening и Closing для обработки сценариев динамического заполнения и нескольких щелчков. ContextMenuStrip поддерживает изображения, состояние проверки пункта меню, текст, клавиши доступа, сочетания клавиш и каскадные меню.

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

Универсальные функции ToolStrip

В следующих разделах описываются функции и поведение, которые являются универсальными для ToolStrip и производных элементов управления.

Рисование

Вы можете реализовать настраиваемое рисование в элементах управления ToolStrip несколькими способами. Как и в случае с другими элементами управления Windows Forms, ToolStrip и ToolStripItem имеют переопределяемые методы OnPaint и события Paint. Как и при обычном рисовании, система координат связана с клиентской областью элемента управления, то есть верхний левый угол элемента управления имеет координаты 0, 0. Событие Paint и метод OnPaint для ToolStripItem ведут себя так же, как и другие события рисования элемента управления.

Элементы управления ToolStrip также обеспечивают более точный доступ к рендерингу элементов и контейнера через класс ToolStripRenderer, который имеет переопределяемые методы для рисования фона, фона элемента, изображения элемента, стрелки элемента, текста элемента и границы ToolStrip. Аргументы событий для этих методов предоставляют несколько свойств, таких как прямоугольники, цвета и текстовые форматы, которые можно настраивать по желанию.

Чтобы настроить всего несколько аспектов рисования элемента, вы обычно переопределяете ToolStripRenderer.

Если вы создаете новый элемент и хотите контролировать все аспекты рисования, переопределите метод OnPaint. Внутри OnPaint вы можете использовать методы из ToolStripRenderer.

По умолчанию для элемента управления ToolStrip задана двойная буферизация с использованием преимуществ параметра OptimizedDoubleBuffer.

Установление родительских связей

Концепция владения контейнерами и родительских связей в элементах управления ToolStrip сложнее, чем в других контейнерных элементах управления Windows Forms. Это необходимо для поддержки динамических сценариев, таких как переполнение и совместное использование раскрывающихся элементов несколькими элементами ToolStrip, а также для поддержки создания ContextMenuStrip из элемента управления.

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

  • OwnerItem обращается к элементу, который является источником раскрывающегося элемента. Он похож на SourceControl, но вместо элемента управления возвращает ToolStripItem.

  • SourceControl определяет, какой элемент управления является источником ContextMenuStrip, когда несколько элементов управления совместно используют один и тот же ContextMenuStrip.

  • GetCurrentParent — это метод доступа только для чтения к свойству Parent. Родитель отличается от владельца тем, что родитель обозначает возвращенный текущий ToolStrip, где отображается элемент, который может находиться в области переполнения.

  • Owner возвращает ToolStrip, чья коллекция элементов содержит текущий ToolStripItem. Это лучший способ сослаться на ImageList или другие свойства в ToolStrip верхнего уровня без написания специального кода для обработки переполнения.

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

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

Например, создайте новое приложение Windows Forms с помощью одного или нескольких элементов управления из предыдущего списка. Задайте для модификатора доступа одного или нескольких элементов управления значение public или protected, а затем выполните сборку проекта. Добавьте форму, которая наследуется от первой формы, а затем выберите унаследованный элемент управления. Этот элемент управления отображается заблокированным, то есть ведет себя так, как если бы его модификатор доступа был private.

Поддержка наследования ToolStripContainer

Элемент управления ToolStripContainer поддерживает ограниченные унаследованные сценарии, как в следующем примере.

  1. Создайте новое приложение Windows Forms.

  2. Добавьте на форму элемент ToolStripContainer.

  3. Задайте для модификатора доступа элемента ToolStripContainer значение public или protected.

  4. Добавьте любое сочетание элементов управления ToolStrip, MenuStrip и ContextMenuStrip в области ToolStripPanel элемента управления ToolStripContainer.

  5. Выполните сборку проекта.

  6. Добавьте форму, которая наследует от первой формы.

  7. Выберите в этой форме унаследованный элемент управления ToolStripContainer.

Унаследованное поведение дочерних элементов управления

После выполнения предыдущих шагов возникает следующее унаследованное поведение.

  • В конструкторе элемент управления отображается со значком наследования.

  • Элементы управления ToolStripPanel заблокированы; вы не можете выбрать или изменить их содержимое.

  • Вы можете добавлять элементы управления в ToolStripContentPanel, перемещать их и сделать их дочерними элементами управления ToolStripContentPanel.

  • Изменения сохраняются после выполнения сборки формы.

    Примечание.

    Удалите модификаторы доступа из всех элементов управления ToolStripPanel, которые являются частью ToolStripContainer. Модификатор доступа ToolStripContainer управляет всем элементом управления.

Частичное доверие

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

  • Элементы управления ToolStripDropDown требуют, чтобы разрешение AllWindows отображало элементы в ToolStripControlHost. Это относится и к встроенным элементам управления, таким как ToolStripTextBox, ToolStripComboBox и ToolStripProgressBar, и к элементам управления, созданным пользователем. Если это требование не выполняется, данные элементы не отображаются. Исключение не выдается.

  • Установка для свойства AutoClose значения false не разрешена, а параметр допускающего отмену события Closing игнорируется. Это делает невозможным ввод более одного нажатия клавиши без закрытия раскрывающегося элемента. Если это требование не выполняется, такие элементы не отображаются. Исключение не выдается.

  • Многие события обработки нажатий клавиш не будут инициированы, если они происходят в контекстах частичного доверия, отличных от AllWindows.

  • Ключи доступа не обрабатываются, если не предоставлено разрешение AllWindows.

Использование

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

  • Присоединение к ToolStripPanel

    ToolStrip можно перемещать в ToolStripPanel и между элементами ToolStripPanel. Свойство Dock игнорируется, и если свойство Stretch имеет значение false, размер ToolStrip увеличивается по мере добавления элементов в ToolStripPanel. Как правило, ToolStrip не участвует в последовательности перехода.

  • Пристыковано

    ToolStrip размещается на одной стороне контейнера в фиксированном положении, расширяясь до размеров того края, к которому он прикреплен. Как правило, ToolStrip не участвует в последовательности перехода.

  • Абсолютное позиционирование

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

Взаимодействие с клавиатурой

Ключи доступа

Один из способов активации элемента управления с помощью клавиатуры — это клавиши доступа, в сочетании с клавишей ALT или после ее нажатия. ToolStrip поддерживает как явные, так и неявные ключи доступа. Явное определение использует амперсанд (>), предшествующий букве. При неявном определении используется алгоритм, который пытается найти соответствующий элемент, исходя из порядка символов в указанном свойстве Text.

Сочетания клавиш

Для определения сочетаний клавиш, используемых MenuStrip, применяется сочетание перечисления Keys (которое не зависит от порядка). Вы также можете с помощью свойства ShortcutKeyDisplayString отображать сочетание клавиш только с текстом, например, отображать "Del" вместо "Delete".

Клавиша ALT активирует элемент MenuStrip, на который указывает MainMenuStrip. Оттуда с помощью сочетания клавиш CTRL+TAB можно перемещаться между элементами управления ToolStrip в панелях ToolStripPanel. Клавиша TAB и клавиши со стрелками на цифровой клавиатуре позволяют перемещаться между элементами в ToolStrip. Навигацию в области переполнения обрабатывает специальный алгоритм. Клавиша ПРОБЕЛ выбирает ToolStripButton, ToolStripDropDownButton или ToolStripSplitButton.

Фокус и проверка

При активации с помощью клавиши ALT MenuStrip и ToolStrip обычно не принимают фокус и не убирают его из элемента управления, который в данный момент имеет фокус. Если в MenuStrip или в раскрывающемся списке MenuStrip размещен элемент управления, он получает фокус, когда пользователь нажимает клавишу TAB. Зачастую события GotFocus, LostFocus, Enter и Leave элемента управления MenuStrip не возникают при активации клавиатурой. В таких случаях вместо них используйте события MenuActivate и MenuDeactivate.

По умолчанию CausesValidation имеет значение false. Для выполнения проверки вызовите Validate явным образом из формы.

Макет

Управление макетом ToolStrip осуществляется путем выбора одного из членов ToolStripLayoutStyle со свойством LayoutStyle.

Макеты "стопка"

Расположение "стопкой" — это размещение элементов рядом друг с другом на обоих концах ToolStrip. В следующем списке приводится описание макетов "стопка".

  • Значение по умолчанию — StackWithOverflow. Этот параметр заставляет ToolStrip автоматически изменять свой макет в соответствии со свойством Orientation для обработки сценариев перетаскивания и закрепления.

  • VerticalStackWithOverflow отображает элементы ToolStrip рядом друг с другом по вертикали.

  • HorizontalStackWithOverflow отображает элементы ToolStrip рядом друг с другом по горизонтали.

Другие возможности макетов "стопка"

Alignment определяет конец ToolStrip, по которому выравнивается элемент.

Если элементы не помещаются в ToolStrip, автоматически появляется кнопка переполнения. Значение свойства Overflow определяет, должен ли элемент отображаться в области переполнения всегда, по мере необходимости или никогда.

В событии LayoutCompleted можно проверить свойство Placement, чтобы определить, был ли элемент помещен в основной ToolStrip, ToolStrip переполнения, или элемент вообще не отображается. Типичные причины, по которым элемент не отображается: элемент не помещается в основной ToolStrip, свойство элемента Overflow имеет значение Never.

Сделайте ToolStrip перемещаемым, поместив его в ToolStripPanel и задав для его свойства GripStyle значение Visible.

Другие варианты макетов

Другие варианты макетов — Flow и Table.

Потоковый макет

Макет Flow используется по умолчанию для ContextMenuStrip, ToolStripDropDownMenu и ToolStripOverflow. Он аналогичен FlowLayoutPanel. Макет Flow имеет следующие возможности.

  • Все возможности FlowLayoutPanel предоставляются свойством LayoutSettings. Необходимо привести класс LayoutSettings к классу FlowLayoutSettings.

  • Свойства Dock и Anchor можно использовать в коде для выравнивания элементов в строке.

  • Свойство Alignment не учитывается.

  • В событии LayoutCompleted можно проверить свойство Placement, чтобы определить, помещается ли элемент в основной ToolStrip или нет.

  • Захват не отображается, поэтому ToolStrip в макете стиля Flow в ToolStripPanel не может быть перемещен.

  • Кнопка переполнения ToolStrip не отображается, и Overflow игнорируется.

Табличный макет

Макет Table используется по умолчанию для StatusStrip. Он аналогичен TableLayoutPanel. Макет Flow имеет следующие возможности.

  • Все возможности TableLayoutPanel предоставляются свойством LayoutSettings. Необходимо привести класс LayoutSettings к классу TableLayoutSettings.

  • Свойства Dock и Anchor можно использовать в коде для выравнивания элементов в ячейке таблицы.

  • Свойство Alignment не учитывается.

  • В событии LayoutCompleted можно проверить свойство Placement, чтобы определить, помещается ли элемент в основной ToolStrip или нет.

  • Захват не отображается, поэтому ToolStrip в макете стиля Table в ToolStripPanel не может быть перемещен.

  • Кнопка переполнения ToolStrip не отображается, и Overflow игнорируется.

ToolStripItem

В следующих разделах описываются ToolStripItem и элементы управления, производные от него.

ToolStripItemявляется абстрактным базовым классом для всех элементов, которые перемещаются в ToolStrip. Следующая объектная модель демонстрирует иерархию наследования ToolStripItem.

Diagram that shows the ToolStripItem object model.

Классы ToolStripItem наследуются либо напрямую от ToolStripItem, либо косвенно от ToolStripItem через ToolStripControlHost или ToolStripDropDownItem.

Элементы управления ToolStripItem должны содержаться в ToolStrip, MenuStrip, StatusStrip или ContextMenuStrip, и их нельзя добавить непосредственно в форму. Различные классы контейнеров предназначены для хранения соответствующего подмножества элементов управления ToolStripItem.

В следующей таблице перечислены элементы управления ToolStripItem "стопки" и контейнеры, в которых они выглядят наилучшим образом. Хотя любой элемент ToolStrip можно разместить в любом производном от ToolStrip контейнере, эти элементы лучше всего выглядят в следующих контейнерах.

Примечание.

ToolStripDropDown не отображается в панели элементов конструктора.

Содержащийся элемент ToolStrip MenuStrip ContextMenuStrip StatusStrip ToolStripDropDown
ToolStripButton Да No No No Да
ToolStripComboBox Да Да Да No Да
ToolStripSplitButton Да No No Да Да
ToolStripLabel Да No No Да Да
ToolStripSeparator Да Да Да No Да
ToolStripDropDownButton Да No No Да Да
ToolStripTextBox Да Да Да No Да
ToolStripMenuItem No Да Да No No
ToolStripStatusLabel No No No Да No
ToolStripProgressBar Да No No Да No
ToolStripControlHost Да Да No Да Да

ToolStripButton

ToolStripButton — это элемент кнопки для ToolStrip. Его можно отображать с различными стилями границ, а также использовать для представления и активации операционных состояний. Вы также можете определить его так, чтобы фокус был в нем по умолчанию.

ToolStripLabel

ToolStripLabel предоставляет функциональные возможности меток в элементах управления ToolStrip. ToolStripLabel, как и ToolStripButtonне получает фокус по умолчанию и не отображается как нажатый или выделенный.

ToolStripLabel в качестве размещенного элемента поддерживает ключи доступа.

Используйте свойства LinkColor, LinkVisited и LinkBehavior в ToolStripLabel для поддержки а управления ссылками в ToolStrip.

ToolStripStatusLabel

ToolStripStatusLabel — это версия ToolStripLabel, предназначенная специально для использования в StatusStrip. Эти специальные возможности включают BorderStyle, BorderSides и Spring.

ToolStripSeparator

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

Вы можете добавить ToolStripSeparator во время разработки, выбрав его из раскрывающегося списка. Однако можно также автоматически создать ToolStripSeparator, введя дефис (-) в узле шаблона конструктора или в методе Add.

ToolStripControlHost

ToolStripControlHost — это абстрактный базовый класс для ToolStripComboBox, ToolStripTextBox и ToolStripProgressBar. ToolStripControlHost может размещать другие элементы управления, включая пользовательские, следующими двумя способами.

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

  • Расширение ToolStripControlHost и в конструкторе без параметров наследуемого класса вызов конструктора базового класса путем передачи класса, производного от Control. Этот параметр позволяет упаковать общие методы и свойства элемента управления для удобного доступа в ToolStrip.

ToolStripComboBox

ToolStripComboBox — это ComboBox, оптимизированный для размещения в ToolStrip. Подмножество свойств и событий размещенного элемента управления предоставляется на уровне ToolStripComboBox, но базовый элемент управления ComboBox полностью доступен через свойство ComboBox.

ToolStripTextBox

ToolStripTextBox — это TextBox, оптимизированный для размещения в ToolStrip. Подмножество свойств и событий размещенного элемента управления предоставляется на уровне ToolStripTextBox, но базовый элемент управления TextBox полностью доступен через свойство TextBox.

ToolStripProgressBar

ToolStripProgressBar — это ProgressBar, оптимизированный для размещения в ToolStrip. Подмножество свойств и событий размещенного элемента управления предоставляется на уровне ToolStripProgressBar, но базовый элемент управления ProgressBar полностью доступен через свойство ProgressBar.

ToolStripDropDownItem

ToolStripDropDownItem — это абстрактный базовый класс для ToolStripMenuItem, ToolStripDropDownButton и ToolStripSplitButton, который может размещать элементы напрямую или размещать дополнительные элементы в раскрывающемся контейнере. Для этого задайте для свойства DropDown значение ToolStripDropDown, а для свойства Items значение ToolStripDropDown. Доступ к этим раскрывающимся элементам возможен непосредственно через свойство DropDownItems.

ToolStripMenuItem

ToolStripMenuItem — это ToolStripDropDownItem, который работает с ToolStripDropDownMenu и ContextMenuStrip для обработки специального выделения, макета и расположения столбцов для меню.

ToolStripDropDownButton

ToolStripDropDownButton выглядит как ToolStripButton, но отображает раскрывающуюся область, когда пользователь щелкает его. Чтобы скрыть или показывать стрелку раскрывающейся области, можно задать свойство ShowDropDownArrow. ToolStripDropDownButton содержит ToolStripOverflowButton, который отображает элементы, вызывающие переполнение ToolStrip.

ToolStripSplitButton

ToolStripSplitButton объединяет функции кнопки и раскрывающегося списка.

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

Универсальные функции ToolStripItem

ToolStripItem предоставляет следующие универсальные функции и параметры для наследования элементов управления.

  • Основные события

  • Обработка изображений

  • Точное понимание

  • Связь текста и изображения

  • Стиль отображения

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

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

Обработка изображений

Свойства Image, ImageAlign, ImageIndex, ImageKey, и ImageScaling относятся к различным аспектам обработки изображений. Используйте изображения в элементах управления ToolStrip, задавая эти свойства напрямую или задавая свойство ImageList только во время выполнения.

Масштабирование изображений определяется взаимодействием свойств в ToolStrip и ToolStripItem следующим образом.

  • ImageScalingSize — это масштаб окончательного образа, определяемый сочетанием параметра образа ImageScaling и параметра контейнера AutoSize.

    • Если AutoSize имеет значение true (по умолчанию), а ToolStripItemImageScaling — SizeToFit, то масштабирование изображений не выполняется, а размер ToolStrip соответствует размеру самого большого элемента или предписанному минимальному размеру.

    • Если AutoSize имеет значение false, а ToolStripItemImageScaling — None, ни изображение, не выполняется масштабирование ни ToolStrip, ни изображения.

Точное понимание

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

Элементы помещаются в ToolStrip в порядке, в котором они отображаются в коллекции Items. Чтобы изменить расположение элемента программными средствами, используйте метод Insert для перемещения элемента в коллекции. Этот метод перемещает элемент, но не дублирует его.

Связь текста и изображения

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

Стиль отображения

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

Вспомогательные классы

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

  • ToolStripManager поддерживает задачи, связанные с ToolStrip, для всех приложений, такие как слияние, настройки и параметры отрисовщика.

  • ToolStripRenderer позволяет легко применять к ToolStrip определенный стиль или тему.

  • ToolStripProfessionalRenderer создает ручки и кисти на основе заменяемой палитры цветов (ProfessionalColorTable).

  • ToolStripSystemRenderer применяет системные цвета и плоский визуальный стиль к приложениям ToolStrip.

  • ToolStripContainer аналогичен SplitContainer. Он использует четыре закрепленные боковые панели (экземпляры ToolStripPanel) и одну центральную панель (экземпляр ToolStripContentPanel) для создания типичного расположения. Удалить боковые панели нельзя, но их можно скрыть. Центральную панель нельзя ни удалить, ни скрыть. Вы можете упорядочить один или несколько элементов управления ToolStrip, MenuStrip или StatusStrip в боковых панелях, а также использовать центральную панель для других элементов управления. Также ToolStripContentPanel предоставляет способ получения поддержки отрисовщика в теле формы для согласованного внешнего вида. ToolStripContainer не поддерживает интерфейс MDI.

  • ToolStripPanel предоставляет пространство для перемещения и упорядочения элементов управления ToolStrip. При желании вы можете использовать только одну панель, и ToolStripPanel хорошо работает в сценариях MDI.

См. также