Как правильно динамически выбирать пункты контекстного меню в WinForms?

Я пытаюсь создать контекстное меню для элемента управления, "связанного" с элементом главного меню. Есть два фиксированных пункта меню, которые всегда присутствуют, и произвольное количество дополнительных пунктов меню, которые могут потребоваться в меню.

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

Основная проблема, по-видимому, заключается в том, что к моменту появления Opening меню уже определило, какие элементы оно будет отображать. Эта форма демонстрирует:

using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public class DemoForm : Form
    {
        private List _items;

        public DemoForm()
        {
            var contextMenu = new ContextMenuStrip();
            contextMenu.Opening += contextMenu_Opening;

            _items = new List();
            _items.Add(new ToolStripMenuItem("item 1"));
            _items.Add(new ToolStripMenuItem("item 2"));


            this.ContextMenuStrip = contextMenu;
        }

        void contextMenu_Opening(object sender, CancelEventArgs e)
        {
            var menu = sender as ContextMenuStrip;

            if (menu != null)
            {
                foreach (var item in _items)
                {
                    menu.Items.Add(item);
                }
            }
        }
    }
}

При первом щелчке формы правой кнопкой мыши ничего не отображается. Во второй раз меню отображается должным образом. Возникает ли другое событие, при котором я могу обновить элементы? Это плохая практика - динамически выбирать пункты меню?

(Примечание. Это пример, который я начал делать для тех, кому нужна такая функциональность, и мне было любопытно, насколько это сложно, поэтому я не могу подробно рассказать, почему это может быть сделано. Этот человек хочет «связать» пункт главного меню с контекстным меню, и, поскольку пункты меню могут быть только дочерними элементами одного меню, это казалось разумным способом сделать это. Любые альтернативные предложения по подходу приветствуются.)

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
568
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете обработать элементы во время события MouseDown элемента управления. Убедитесь, что это правая кнопка мыши.

Спасибо! У меня была аналогичная проблема с динамически генерируемым ContextMenuStrip из NotifyIcon, это решило неустойчивое поведение, которое у меня было при использовании обработчика событий открытия ContextMenuStrip.

RedGlyph 08.01.2010 23:06

Другие вопросы по теме