html

Зміст

MenuStrip в C#

Вступ в MenuStrip

MenuStrip - ссучасний компонент для створення меню в Windows Forms додатках.

?? Основное применение: навигация по приложению, доступ к функциям, организация команд.

Основні властивості

Властивості ToolStripMenuItem

Створення и базове налаштування

Програмне створення

// Створення MenuStrip
MenuStrip menuStrip1 = new MenuStrip();
menuStrip1.Dock = DockStyle.Top;
menuStrip1.GripStyle = ToolStripGripStyle.Visible;

// Добавление на форму
this.Controls.Add(menuStrip1);
this.MainMenuStrip = menuStrip1;

Створення пунктів меню

// Пункт меню "Файл"
ToolStripMenuItem fileMenuItem = new ToolStripMenuItem("&Файл");

// Подпункты
ToolStripMenuItem newMenuItem = new ToolStripMenuItem("&Створити");
newMenuItem.ShortcutKeys = Keys.Control | Keys.N;
newMenuItem.Image = Image.FromFile("new.png");

ToolStripMenuItem openMenuItem = new ToolStripMenuItem("&Відкрити");
openMenuItem.ShortcutKeys = Keys.Control | Keys.O;

ToolStripMenuItem exitMenuItem = new ToolStripMenuItem("&Вихід");
exitMenuItem.ShortcutKeys = Keys.Alt | Keys.F4;

// Добавление в меню
fileMenuItem.DropDownItems.AddRange(new ToolStripItem[] {
    newMenuItem, openMenuItem, exitMenuItem
});
menuStrip1.Items.Add(fileMenuItem);

Обробка подій

Click полія

// Обробник для пункта "Створити"
private void newMenuItem_Click(object sender, EventArgs e) {
    // Створення нового документа
    textBox1.Clear();
    this.Text = "Новый документ - MyApp";
    isDocumentChanged = false;
}

// Привязка обработчика
newMenuItem.Click += newMenuItem_Click;

DropDown подія

// Перед відкриттям підменю
private void fileMenuItem_DropDownOpening(object sender, EventArgs e) {
    // Динамічне оновлення меню
    saveMenuItem.Enabled = isDocumentChanged;
    printMenuItem.Enabled = !string.IsNullOrEmpty(textBox1.Text);
}

// Після закриття підменю
private void fileMenuItem_DropDownClosed(object sender, EventArgs e) {
    // Сброс состояний
    statusLabel.Text = "Готов";
}

Створення складного меню

Багаторівневе меню

// Створення головного меню
ToolStripMenuItem viewMenuItem = new ToolStripMenuItem("&Вид");

// Підменю "Масштаб"
ToolStripMenuItem zoomSubMenu = new ToolStripMenuItem("&Масштаб");
zoomSubMenu.DropDownItems.Add("&50%", null, zoomMenuItem_Click);
zoomSubMenu.DropDownItems.Add("&100%", null, zoomMenuItem_Click);
zoomSubMenu.DropDownItems.Add("&150%", null, zoomMenuItem_Click);

// Підменю "Панели инструментов"
ToolStripMenuItem toolbarsSubMenu = new ToolStripMenuItem("&Панели инструментов");
ToolStripMenuItem standardToolbarItem = new ToolStripMenuItem("&Стандартная");
standardToolbarItem.CheckOnClick = true;
standardToolbarItem.Checked = true;
toolbarsSubMenu.DropDownItems.Add(standardToolbarItem);

viewMenuItem.DropDownItems.AddRange(new ToolStripItem[] {
    zoomSubMenu, toolbarsSubMenu
});
menuStrip1.Items.Add(viewMenuItem);

Спеціалні елементи

// Роздільник
ToolStripSeparator separator = new ToolStripSeparator();
fileMenuItem.DropDownItems.Add(separator);

// CheckBox меню
ToolStripMenuItem statusBarMenuItem = new ToolStripMenuItem("&Рядок стану");
statusBarMenuItem.CheckOnClick = true;
statusBarMenuItem.Checked = true;
statusBarMenuItem.Click += (s, e) => {
    statusStrip1.Visible = statusBarMenuItem.Checked;
};

// RadioButton меню
ToolStripMenuItem leftAlignItem = new ToolStripMenuItem("По &левому краю");
leftAlignItem.CheckOnClick = true;
leftAlignItem.Click += AlignMenuItem_Click;
Важливо: Для RadioButton поведения нужно дополнительно управлять состоянием Checked в обработчиках.

Контекстне меню (ContextMenuStrip)

// Створення контекстного меню
ContextMenuStrip contextMenuStrip1 = new ContextMenuStrip();

// Додавання пунктів
contextMenuStrip1.Items.Add("&Копировать", null, copyMenuItem_Click);
contextMenuStrip1.Items.Add("&Вставить", null, pasteMenuItem_Click);
contextMenuStrip1.Items.Add(new ToolStripSeparator());
contextMenuStrip1.Items.Add("&Выделить все", null, selectAllMenuItem_Click);

// Привязка к контролу
textBox1.ContextMenuStrip = contextMenuStrip1;
dataGridView1.ContextMenuStrip = contextMenuStrip1;
Порада:Використовуйте контекстні меню для операцій с конкретними елементами інтерфейса.

Динамічне меню

// Дінамичне створення меню
private void UpdateRecentFilesMenu() {
    // Видалемо старі пункти
    foreach (ToolStripItem item in fileMenuItem.DropDownItems) {
        if (item.Tag is string tag && tag == "recent") {
            fileMenuItem.DropDownItems.Remove(item);
        }
    }

    // Додаємо раздільник
    if (recentFiles.Count > 0) {
        fileMenuItem.DropDownItems.Add(new ToolStripSeparator());
    }

    // Добавляем недавние файлы
    foreach (string filePath in recentFiles) {
        ToolStripMenuItem recentItem = new ToolStripMenuItem(filePath);
        recentItem.Tag = "recent";
        recentItem.Click += (s, e) => OpenRecentFile(filePath);
        fileMenuItem.DropDownItems.Add(recentItem);
    }
}

Стилізація и кастомизация

// Налаштування зовнішнього вигляду
menuStrip1.BackColor = Color.SteelBlue;
menuStrip1.ForeColor = Color.White;
menuStrip1.Font = new Font("Segoe UI", 10);

// ProfessionalRenderer для кастомного вида
menuStrip1.Renderer = new CustomMenuRenderer();

// Кастомний рендерер
public class CustomMenuRenderer : ToolStripProfessionalRenderer {
    protected override void OnRenderMenuItemBackground(
        ToolStripItemRenderEventArgs e) {
        if (e.Item.Selected) {
            e.Graphics.FillRectangle(Brushes.DarkOrange, e.Item.ContentRectangle);
        } else {
            base.OnRenderMenuItemBackground(e);
        }
    }
}

Практичні приклади

Текстовий редактор

private void InitializeTextEditorMenu() {
    // Меню Формат
    ToolStripMenuItem formatMenuItem = new ToolStripMenuItem("Фо&рмат");
    
    ToolStripMenuItem fontMenuItem = new ToolStripMenuItem("&Шрифт...");
    fontMenuItem.Click += (s, e) => {
        FontDialog dialog = new FontDialog();
        if (dialog.ShowDialog() == DialogResult.OK) {
            textBox1.Font = dialog.Font;
        }
    };
    
    ToolStripMenuItem colorMenuItem = new ToolStripMenuItem("Ц&вет...");
    colorMenuItem.Click += (s, e) => {
        ColorDialog dialog = new ColorDialog();
        if (dialog.ShowDialog() == DialogResult.OK) {
            textBox1.ForeColor = dialog.Color;
        }
    };
    
    formatMenuItem.DropDownItems.AddRange(new ToolStripItem[] {
        fontMenuItem, colorMenuItem
    });
    menuStrip1.Items.Add(formatMenuItem);
}

Меню з іконками

// Додавання іконок к пунктам меню
ToolStripMenuItem cutMenuItem = new ToolStripMenuItem("&Вырезать");
cutMenuItem.Image = Properties.Resources.CutIcon;
cutMenuItem.ShortcutKeys = Keys.Control | Keys.X;

ToolStripMenuItem copyMenuItem = new ToolStripMenuItem("&Копіювати");
copyMenuItem.Image = Properties.Resources.CopyIcon;
copyMenuItem.ShortcutKeys = Keys.Control | Keys.C;

ToolStripMenuItem pasteMenuItem = new ToolStripMenuItem("&Вставить");
pasteMenuItem.Image = Properties.Resources.PasteIcon;
pasteMenuItem.ShortcutKeys = Keys.Control | Keys.V;

editMenuItem.DropDownItems.AddRange(new ToolStripItem[] {
    cutMenuItem, copyMenuItem, pasteMenuItem
});

Найкращі практики та поради

UX поради:
  • Використовуйте амперсанд (&) для підкреслення гарячих клавіш
  • Групуйте пов'язані команди роздільниками
  • Вимкайте (Enabled = false) недоступні команди
  • Використовуйте стандартні комбінації клавіш (Ctrl+S, Ctrl+O тощо)
// Правильна организація меню
// 1. Стандартні горячі клавиши
newMenuItem.ShortcutKeys = Keys.Control | Keys.N;
openMenuItem.ShortcutKeys = Keys.Control | Keys.O;
saveMenuItem.ShortcutKeys = Keys.Control | Keys.S;

// 2. Динамічне оновлення стану вкладок
private void UpdateMenuStates() {
    saveMenuItem.Enabled = isDocumentChanged;
    undoMenuItem.Enabled = CanUndo();
    redoMenuItem.Enabled = CanRedo();
}

// 3. Локализація меню
private void LocalizeMenu() {
    fileMenuItem.Text = Resources.Menu_File;
    newMenuItem.Text = Resources.Menu_New;
    openMenuItem.Text = Resources.Menu_Open;
}
Важливо: Завжди встановлюйте властивість MainMenuStrip форми для коректної роботи з клавішею Alt.
// Установка головного меню форми
this.MainMenuStrip = menuStrip1;

Зміст