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

StackOverflow https://stackoverflow.com/questions/103514

  •  01-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top