.net - opciones - menu emergente
¿Cuál es la forma correcta de elegir dinámicamente elementos de menú para un menú contextual en WinForms? (1)
Estoy tratando de crear un menú contextual para un control que está "vinculado" a un elemento del menú principal. Hay dos elementos de menú fijo que están siempre allí y una cantidad arbitraria de elementos de menú adicionales que pueden necesitar estar en el menú.
Intenté resolver el problema manteniendo una referencia a nivel de clase de los elementos del menú fijo y una lista de los elementos del menú dinámico. Estoy manejando los eventos de Opening
ambos menús 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 problema principal parece ser que cuando se Opening
la Opening
, el menú ya ha decidido qué elementos va a mostrar. Esta forma 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 con el botón derecho en el formulario la primera vez, no se muestra nada. La segunda vez, el menú se muestra como se esperaba. ¿Hay algún otro evento que se plantee en el que pueda actualizar los elementos? ¿Es una mala práctica elegir dinámicamente los elementos del menú?
( Nota: Esto es para un ejemplo que comencé a hacer para alguien que quería dicha funcionalidad y tenía curiosidad sobre lo difícil que es, por lo que no puedo proporcionar detalles sobre por qué esto podría hacerse. Esta persona quiere "vincular" una de las principales elemento del menú al menú contextual, y dado que los elementos del menú solo pueden ser hijos de un solo menú, esta parecía una forma razonable de hacerlo. Cualquier sugerencia alternativa para un enfoque es bienvenida ) .
Podría resolver los elementos durante el evento MouseDown del control. Verifique que también sea el botón derecho del mouse.