2012-02-09 67 views
18

Estoy tratando de hacer una lista de elementos con los que puede hacer varias acciones haciendo clic derecho y tener un menú contextual. Lo he completado, no hay problema en absoluto.Haga clic con el botón derecho para seleccionar elementos en un ListBox

Pero me gustaría tenerlo para que cuando haga clic derecho en un elemento, en lugar de dejar el elemento actual seleccionado, seleccione el elemento que el mouse haya terminado.

He investigado esta y otras preguntas relacionadas, y he intentado usar indexFromPoint (que encontré a través de mi investigación) pero cada vez que hago clic derecho en un elemento, siempre borra el elemento seleccionado y no lo hace mostrar el menú contextual, ya que lo tengo configurado para que no aparezca si no hay un elemento seleccionado.

Aquí está el código que estoy usando actualmente:

ListBox.SelectedIndex = ListBox.IndexFromPoint(Cursor.Position.X, Cursor.Position.Y); 
+0

esto parece como un error en System.Windows.Forms.ListBox, debemos informarlo a Microsoft. Si –

Respuesta

31

manija ListBox.MouseDown y seleccione el elemento en ese país. De esta manera:

private void listBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    listBox1.SelectedIndex = listBox1.IndexFromPoint(e.X, e.Y); 
} 
+4

menú contextual ya está delimitada al cuadro de lista, sólo tiene que utilizar: privada listBoxItems_MouseDown void (object sender, MouseEventArgs e) { listBoxItems.SelectedIndex = listBoxItems.IndexFromPoint (e.X, e.Y); } –

5

éste está funcionando ...

this.ListBox.MouseUp += new System.Windows.Forms.MouseEventHandler(this.List_RightClick); 

private void List_RightClick(object sender, MouseEventArgs e) 
{ 

    if (e.Button == MouseButtons.Right) 
    { 
     int index = this.listBox.IndexFromPoint(e.Location); 
     if (index != ListBox.NoMatches) 
     { 
      listBox.Items[index]; 
     } 
    } 

} 
+0

Acaba de reemplazar esta línea listBox.Items [index]; con .SelectedIndex = index; y esto funciona perfectamente –

+0

Es extraño que el evento click no parezca capturar el botón derecho o el botón central. Tienes que usar MouseUp para capturarlos ... – MattClimbs

0

también conseguir mismo comportamiento estableciendo un evento MouseRightButtonUp en todo el cuadro de lista a continuación:

private void AccountItemsT33_OnMouseRightButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    // If have selected an item via left click, then do a right click, need to disable that initial selection 
    AccountItemsT33.SelectedIndex = -1; 
    VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(null), (sender as ListBox)).OfType<ListBoxItem>().First().IsSelected = true; 
} 
Cuestiones relacionadas