Как правильно динамически выбирать пункты меню для контекстного меню в WinForms? - PullRequest
3 голосов
/ 19 сентября 2008

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

Я попытался решить проблему, сохранив ссылку на уровне класса на фиксированные пункты меню и список динамических пунктов меню. Я обрабатываю события 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);
                }
            }
        }
    }
}

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

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

1 Ответ

2 голосов
/ 19 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...