Я пытаюсь создать контекстное меню для элемента управления, "связанного" с элементом главного меню. Есть два фиксированных пункта меню, которые всегда присутствуют, и произвольное количество дополнительных пунктов меню, которые могут потребоваться в меню.
Я попытался решить проблему, сохранив ссылку на уровне класса на фиксированные пункты меню и список пунктов динамического меню. Я обрабатываю события 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);
}
}
}
}
}
При первом щелчке формы правой кнопкой мыши ничего не отображается. Во второй раз меню отображается должным образом. Возникает ли другое событие, при котором я могу обновить элементы? Это плохая практика - динамически выбирать пункты меню?
(Примечание. Это пример, который я начал делать для тех, кому нужна такая функциональность, и мне было любопытно, насколько это сложно, поэтому я не могу подробно рассказать, почему это может быть сделано. Этот человек хочет «связать» пункт главного меню с контекстным меню, и, поскольку пункты меню могут быть только дочерними элементами одного меню, это казалось разумным способом сделать это. Любые альтернативные предложения по подходу приветствуются.)





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