¿Cuál es la forma correcta de elegir dinámicamente elementos de menú para un menú contextual en WinForms?

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

  •  01-07-2019
  •  | 
  •  

Pregunta

Estoy intentando crear un menú contextual para un control que está "vinculado" a un elemento del menú principal.Hay dos elementos de menú fijos que siempre están ahí y una cantidad arbitraria de elementos de menú adicionales que podrían necesitar estar en el menú.

Intenté resolver el problema manteniendo una referencia a nivel de clase a los elementos del menú fijo y una lista de los elementos del menú dinámico.Estoy manejando ambos menús. Opening eventos borrando la lista actual de elementos y luego agregando los elementos apropiados al menú.Esto funciona bien para el menú principal, pero el menú contextual se comporta de manera extraña.

El principal problema parece ser que cuando Opening aparece, el menú ya ha decidido qué elementos va a mostrar.Este formulario demuestra:

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

Cuando hace clic derecho en el formulario por primera vez, no se muestra nada.La segunda vez, el menú se muestra como se esperaba.¿Se genera otro evento en el que podría actualizar los elementos?¿Es una mala práctica elegir dinámicamente los elementos del menú?

(Nota:Este es un ejemplo que comencé a crear para alguien que quería dicha funcionalidad y tenía curiosidad sobre lo difícil que es, por lo que no puedo brindar detalles sobre por qué se podría hacer esto.Esta persona quiere "vincular" un elemento del menú principal al menú contextual y, dado que los elementos del menú solo pueden ser hijos de un único menú, esta parecía una forma razonable de hacerlo.Cualquier sugerencia alternativa para un enfoque es bienvenida.)

¿Fue útil?

Solución

Podría resolver los elementos durante el evento MouseDown del control.Comprueba que también sea el botón derecho del ratón.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top