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


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

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

ТулСтрип

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

ToolStrip — абстрактный базовый класс для MenuStrip, StatusStripи ContextMenuStrip. В следующей объектной модели показана 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.

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

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

По умолчанию CausesValidation — это false. Явно вызовите Validate на своей форме для выполнения проверки.

Схема

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

Макеты стека

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

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

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

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

Другие особенности макетов типа Stack

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

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

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

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

Другие параметры макета

Другие параметры макета: Flow и Table.

Макет потока

Flow является макетом по умолчанию для ContextMenuStrip, ToolStripDropDownMenu и ToolStripOverflow. Это похоже на FlowLayoutPanel. Ниже приведены функции макета Flow .

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

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

  • Свойство Alignment игнорируется.

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

  • Захват не отображается, поэтому ToolStripFlow стиль макета в 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 иерархия наследования.

Схема с объектной моделью ToolStripItem.

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

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

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

Замечание

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

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

кнопка на панели инструментов

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

ToolStripLabel

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

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

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

Элемент статуса ToolStrip

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

Разделитель панели инструментов

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

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

ToolStripControlHost (or, if context demands: Хост элемента управления ToolStrip)

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, и ImageIndexImageAlignImageKeyImageScaling свойства относятся к различным аспектам обработки изображений. Используйте изображения в ToolStrip элементах управления, задав эти свойства напрямую или задав свойство ImageList, доступное только во время выполнения.

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

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

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

    • Если AutoSize равно false, а ToolStripItemImageScaling равно None, ни масштабирование изображений, ни ToolStrip не происходит.

Выравнивание

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

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

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

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

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

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

Классы аксессуаров

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

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

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

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

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

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

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

См. также