Qual è il modo giusto di scegliere dinamicamente le voci di menu per un menu di scelta rapida in WinForms?

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

  •  01-07-2019
  •  | 
  •  

Domanda

Sto provando a creare un menu di scelta rapida per un controllo che è " collegato " a una voce del menu principale. Esistono due voci di menu fisse che sono sempre presenti e un numero arbitrario di voci di menu aggiuntive che potrebbero dover essere presenti nel menu.

Ho provato a risolvere il problema mantenendo un riferimento a livello di classe alle voci di menu fisse e un elenco delle voci di menu dinamiche. Sto gestendo gli eventi Apertura di entrambi i menu cancellando l'elenco corrente di voci, quindi aggiungendo le voci appropriate al menu. Funziona bene con il menu principale, ma il menu di scelta rapida si comporta in modo strano.

Il problema principale sembra essere che quando viene sollevato Apertura , il menu ha già deciso quali elementi visualizzare. Questo modulo dimostra:

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);
                }
            }
        }
    }
}

Quando si fa clic con il pulsante destro del mouse sul modulo per la prima volta, non viene visualizzato nulla. La seconda volta, il menu viene visualizzato come previsto. Esiste un altro evento in cui è possibile aggiornare gli elementi? È una cattiva pratica scegliere dinamicamente le voci di menu?

( Nota: questo è un esempio che ho iniziato a creare per qualcuno che desiderasse tale funzionalità ed ero curioso di sapere quanto fosse difficile, quindi non posso fornire dettagli sul perché questo potrebbe essere fatto. Questa persona vuole per "collegare" una voce di menu principale al menu di scelta rapida, e poiché le voci di menu possono essere solo figlio di un singolo menu, questo sembrava un modo ragionevole per farlo. Qualsiasi suggerimento alternativo per un approccio è il benvenuto. )

È stato utile?

Soluzione

È possibile elaborare gli elementi durante l'evento MouseDown del controllo. Verifica che sia anche il pulsante destro del mouse.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top