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


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

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

ToolStrip

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

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

Модель объекта ToolStrip

Модель объекта ToolStrip

Можно получить доступ ко всем элементам 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 игнорируется.

Элемент ToolStrip

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

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

Модель объекта ToolStripItem

Модель объекта ToolStripItem

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

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

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

Примечание

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

Элемент в контейнере

ToolStrip

MenuStrip

ContextMenuStrip

StatusStrip

ToolStripDropDown

ToolStripButton

Да

Нет

Нет

Нет

Да

ToolStripComboBox

Да

Да

Да

Нет

Да

ToolStripSplitButton

Да

Нет

Нет

Да

Да

ToolStripLabel

Да

Нет

Нет

Да

Да

ToolStripSeparator

Да

Да

Да

Нет

Да

ToolStripDropDownButton

Да

Нет

Нет

Да

Да

ToolStripTextBox

Да

Да

Да

Нет

Да

ToolStripMenuItem

Нет

Да

Да

Нет

Нет

ToolStripStatusLabel

Нет

Нет

Нет

Да

Нет

ToolStripProgressBar

Да

Нет

Нет

Да

Нет

ToolStripControlHost

Да

Да

Нет

Да

Да

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 сочетает функциональные возможности обычной кнопки и кнопки раскрывающегося списка.

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

Общие возможности 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 в порядке своего появления коллекции элементов. Чтобы изменить расположение элемента программным способом, переместите элемент внутри коллекции, используя метод Insert. Указанный метод перемещает элемент, но не дублирует его.

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

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

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

DisplayStyle позволяет задать значения свойств текста и изображения элемента. При этом отображаются только требуемые элементы. Эта возможность обычно используется для изменения только стиля отображения при выводе того же элемента на экран в другом контексте.

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

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

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

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

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

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

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

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

См. также

Ссылки

Общие сведения об элементе управления ToolStrip (Windows Forms)

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

Технологии, положенные в основу работы элемента управления ToolStrip

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

Элемент управления ToolStrip (Windows Forms)

Элемент управления MenuStrip (Windows Forms)

Элемент управления StatusStrip

Элемент управления ContextMenuStrip

Элемент управления BindingNavigator (Windows Forms)