Как правильно динамически выбирать пункты контекстного меню в 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);
                }
            }
        }
    }
}

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

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


person OwenP    schedule 19.09.2008    source источник


Ответы (1)


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

person Vincent McNabb    schedule 19.09.2008
comment
Спасибо! Была аналогичная проблема с динамически генерируемым ContextMenuStrip из NotifyIcon, это решило неустойчивое поведение, которое у меня было при использовании обработчика событий открытия ContextMenuStrip. - person RedGlyph; 08.01.2010