Для создания меню в Windows Forms применяется элемент MenuStrip. Данный класс унаследован от ToolStrip и поэтому наследует его функциональность.
Наиболее важные свойства компонента MenuStrip:
Dock
: прикрепляет меню к одной из сторон формы
LayoutStyle
: задает ориентацию панели меню на форме. Может также, как и с ToolStrip, принимать следующие значения
HorizontalStackWithOverflow
: расположение по горизонтали с переполнением - если длина меню превышает длину контейнера,
то новые элементы, выходящие за границы контейнера, не отображаются, то есть панель переполняется элементами
StackWithOverflow
: элементы располагаются автоматически с переполнением
VerticalStackWithOverflow
: элементы располагаются вертикально с переполнением
Flow
: элементы размещаются автоматически, но без переполнения - если длина панели меню меньше длины контейнера, то
выходящие за границы элементы переносятся
Table
: элементы позиционируются в виде таблицы
ShowItemToolTips
: указывает, будут ли отображаться всплывающие подсказки для отдельных элементов меню
Stretch
: позволяет растянуть панель по всей длине контейнера
TextDirection
: задает направление текста в пунктах меню
MenuStrip выступает своего рода контейнером для отдельных пунктов меню, которые представлены объектом ToolStripMenuItem.
Добавить новые элементы в меню можно в режиме дизайнера:
Для добавления доступно три вида элементов: MenuItem
(объект ToolStripMenuItem), ComboBox
и TextBox
. Таким образом,
в меню мы можем использовать выпадающие списки и текстовые поля, однако, как правило, эти элементы применяются в основном на панели инструментов.
Меню же обычно содержит набор объектов ToolStripMenuItem.
Также мы можем добавить пункты меню в коде C#:
public partial class Form1 : Form { public Form1() { InitializeComponent(); ToolStripMenuItem fileItem = new ToolStripMenuItem("Файл"); fileItem.DropDownItems.Add("Создать"); fileItem.DropDownItems.Add(new ToolStripMenuItem("Сохранить")); menuStrip1.Items.Add(fileItem); ToolStripMenuItem aboutItem = new ToolStripMenuItem("О программе"); aboutItem.Click += aboutItem_Click; menuStrip1.Items.Add(aboutItem); } void aboutItem_Click(object sender, EventArgs e) { MessageBox.Show("О программе"); } }
ToolStripMenuItem в конструкторе принимает текстовую метку, которая будет использоваться в качестве текста меню. Каждый подобный объект имеет коллекцию DropDownItems, которая хранит дочерние объекты ToolStripMenuItem. То есть один элемент ToolStripMenuItem может содержать набор других объектов ToolStripMenuItem. И таким образом, образуется иерархическое меню или структура в виде дерева.
Если передать при добавление строку текста, то для нее неявным образом будет создан объект ToolStripMenuItem: fileItem.DropDownItems.Add("Создать")
Назначив обработчики для события Click
, мы можем обработать нажатия на пункты меню: aboutItem.Click += aboutItem_Click
Свойство CheckOnClick
при значении true позволяет на клику отметить пункт меню. А с помощью свойства Checked
можно установить, будет ли пункт меню отмечен при запуске программы.
Еще одно свойство CheckState
возвращает состояние пункта меню - отмечен он или нет. Оно может принимать три значения:
Checked
(отмечен), Unchecked
(неотмечен) и Indeterminate
(в неопределенном состоянии)
Например, создадим ряд отмеченных пунктов меню и обработаем событие установки / снятия отметки:
public partial class Form1 : Form { public Form1() { InitializeComponent(); ToolStripMenuItem fileItem = new ToolStripMenuItem("Файл"); ToolStripMenuItem newItem = new ToolStripMenuItem("Создать") { Checked = true, CheckOnClick = true }; fileItem.DropDownItems.Add(newItem); ToolStripMenuItem saveItem = new ToolStripMenuItem("Сохранить") { Checked = true, CheckOnClick = true }; saveItem.CheckedChanged += menuItem_CheckedChanged; fileItem.DropDownItems.Add(saveItem); menuStrip1.Items.Add(fileItem); } void menuItem_CheckedChanged(object sender, EventArgs e) { ToolStripMenuItem menuItem = sender as ToolStripMenuItem; if (menuItem.CheckState == CheckState.Checked) MessageBox.Show("Отмечен"); else if (menuItem.CheckState == CheckState.Unchecked) MessageBox.Show("Отметка снята"); } }
Если нам надо быстро обратиться к какому-то пункту меню, то мы можем использовать клавиши быстрого доступа. Для задания клавиш быстрого доступа используется свойство ShortcutKeys:
public partial class Form1 : Form { public Form1() { InitializeComponent(); ToolStripMenuItem fileItem = new ToolStripMenuItem("Файл"); ToolStripMenuItem saveItem = new ToolStripMenuItem("Сохранить") { Checked = true, CheckOnClick = true }; saveItem.Click+=saveItem_Click; saveItem.ShortcutKeys = Keys.Control | Keys.P; fileItem.DropDownItems.Add(saveItem); menuStrip1.Items.Add(fileItem); } void saveItem_Click(object sender, EventArgs e) { MessageBox.Show("Сохранение"); } }
Клавиши задаются с помощью перечисления Keys
. В данном случае по нажатию на комбинацию клавиш Ctrl + P, будет срабатывать нажатие на пункт
меню "Сохранить".
С помощью изображений мы можем разнообразить внешний вид пунктов меню. Для этого мы можем использовать следующие свойства:
DisplayStyle
: определяет, будет ли отображаться на элементе текст, или изображение, или и то и другое.
Image
: указывает на само изображение
ImageAlign
: устанавливает выравнивание изображения относительно элемента
ImageScaling
: указывает, будет ли изображение растягиваться, чтобы заполнить все пространство элемента
ImageTransparentColor
: указывает, будет ли цвет изображения прозрачным
Если изображение для пункта меню устанавливает в режиме дизайнера, то нам надо выбрать в окне свойство пункт Image, после чего откроется окно для импорта ресурса изображения в проект
Чтобы указать, как разместить изображение, у свойства DisplayStyle надо установить значение Image
. Если мы хотим, чтобы
кнопка отображала только текст, то надо указать значение Text
, либо можно комбинировать два значения с помощью другого
значения ImageAndText
. По умолчанию изображение размещается слева от текста:
Также можно установить изображение динамически в коде:
fileToolStripMenuItem.Image = Image.FromFile(@"D:\Icons\0023\block32.png");