2008-09-19 3 views
3

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

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

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

ответ

2

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

+1

Pun не предназначен. – 2008-09-19 16:38:59