Esto podría ser muy simple y yo no estoy viendo porque es el final de un largo día, y si es que pido disculpas de antemano.

Tengo un conjunto de Botones que al hacer clic derecho emergente de un ContextMenu. El menú tiene dos Entradas, ambos de los cuales tienen un Clic en el controlador de función asignada. Yo soy la activación de la ContextMenu para ventana emergente de la derecha haga clic en un botón así:

Excesivamente simplificado ejemplo:


public void InitiailizeButtonContextMenu()
{
    buttonContextMenu = new ContextMenu();
    MenuItem foo = new MenuItem("foo");
    foo.Click += OnFooClicked;

    MenuItemCollection collection = new MenuItemCollection(buttonContextMenu);
    collection.Add(foo);
}

public void OnButtonMouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
        //left click stuff handling
    if (e.Button == MouseButtons.Right)
        buttonContextMenu.Show((Button)sender, new Point(e.X, e.Y));
}


public void OnFooClicked(object sender, EventArgs e)
{
    //Need to get the Button the ContextMenu .Show'd on in
    //OnButtonMouseClick...  thoughts?
}


ContextMenu buttonContextMenu; 

Necesito para ser capaz de obtener el Botón que activa el ContextMenu pop-up en el haga Clic EN el controlador para el MenuItem, o llegar a ella de alguna manera. MenuItem.Haga clic en toma EventArgs, así que nada útiles. Puedo convertir un objeto emisor de vuelta a MenuItem pero no puedo encontrar nada que me dice que lo que hizo pop-up. Es esto posible?

  • Es este un WinForms y WPF pregunta?
InformationsquelleAutor trycatch | 2011-04-11

6 Comentarios

  1. 7

    Utilizar el ContextMenu.SourceControl de la propiedad, se le da una referencia a la instancia de Botón de nuevo.

    • Vale la pena destacar (en caso de que alguien con este mismo problema viene a través de esta pregunta) lo que tienes que hacer: Botón primario = (Button)((ContextMenu)((MenuItem)remitente).De los padres).SourceControl; para obtener todo el camino hasta el botón de la MenuItem, pero esto funciona! Gracias.
    • En caso de que alguien como yo necesita esto para wpf, debe utilizar PlacementTarget propiedad: Botón btn = (Button)((ContextMenu)((MenuItem)remitente).De los padres).PlacementTarget;
  2. 2

    En el anterior fragmento de código, cuando se llama al método show de buttonContextMenu, se pasa el objeto de botón a buttonContextMenu cuando usted haga clic en el botón.

    Para acceder al botón en el OnFooClicked método de fundido el «emisor» de vuelta a un botón.

    public void OnFooClicked(object sender, EventArgs e)
    {
         ((MenuItem)sender).Parent //This is the button
    }

    *No sé si MenuItem es el correcto reparto pero debe ser a lo largo de esas líneas.

    • Yo estoy lejos de mi código, pero estoy 90% seguro de que he intentado esto, y se lanzó una excepción porque el remitente era un MenuItem porque es un MenuItem.Haga clic en controlador.
    • Oops, lo siento. Sí, eso no va a funcionar. Usted debe ser capaz de hacer referencia a los Padres, y que será su botón. Lo siento.
    • Los padres de MenuItem es Menú.
    • Bien, gracias =D
  3. 1

    Si usted está usando ContextMenuStrip y ToolStripItem, en lugar de ContextMenu y MenuItem, usted necesitará:

    private void myToolStripMenuItem_Click(object sender, EventArgs e)
    {
       Button parent = (Button)((ContextMenuStrip)((ToolStripItem)sender).Owner).SourceControl;
       ...

    Con un regular ContextMenu y MenuItem (de trycatch el comentario sobre Hans Pasante de post):

    Button parent = (Button)((ContextMenu)((MenuItem)sender).Parent).SourceControl; 
  4. 0
    
    
    Button buttonThatTriggeredTheContextMenu; 
    
    public void OnButtonMouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
            //left click stuff handling
        if (e.Button == MouseButtons.Right) {
            buttonThatTriggeredTheContextMenu = (Button)sender;
            buttonContextMenu.Show((Button)sender, new Point(e.X, e.Y));
        }
    }
    
    
    public void OnFooClicked(object sender, EventArgs e)
    {
        //buttonThatTriggeredTheContextMenu contains the button you want
    }
    
  5. 0

    No estoy 100% en esta – su de código que escribí hace unos 2 años, pero espero que se pone en movimiento en este.

    MenuItem item = (MenuItem)sender;
    DependencyObject dep = item.Parent;
    while((dep != null) && !(dep is Button))
        dep =  VisualTreeHelper.GetParent(dep);
    
    if (dep == null)
        return;
    Button button = dep as Button;
  6. 0
    button mybutton = ((ContextMenu)((MenuItem)sender).Parent).SourceControl as button;

Dejar respuesta

Please enter your comment!
Please enter your name here