personalizados herencia heredar heredados controles aplicando c# winforms listbox double-click

c# - herencia - Quiero detectar un elemento doble clic en un control de cuadro de lista de winforms.



controles personalizados aplicando herencia (2)

bueno, tengo un cuadro de lista con algunos elementos dentro.
Quiero detectar un doble clic en un elemento.
Actualmente, el método que estoy utilizando tiene el problema de que si un usuario hace doble clic en un punto vacío, el elemento actualmente seleccionado se señala como doble clic.

Actualizar:
Tenga en cuenta que esta pregunta no es tan fácil como parece al principio.
También tenga en cuenta que la respuesta de Timwi no es correcta porque la parte [if (ListBox1.SelectedIndex == -1)] no se ejecuta si hay un elemento seleccionado y hago clic en un espacio vacío. No sé quién lo votó pero su respuesta no es correcto.
ya tenía escrita esta parte del código
si hay una función que puede convertir las coordenadas del mouse en un elemento de la lista, se solucionará el problema


Hay un evento alternativo: MouseDoubleClick , que proporciona MouseEventArgs, para que pueda obtener las coordenadas de clic. Luego puede llamar a GetItemBounds() para obtener un rectángulo que contenga el elemento seleccionado y verificar si las coordenadas del mouse están dentro de este rectángulo:

private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e) { if(listBox1.SelectedIndex != -1) { var rect = listBox1.GetItemRectangle(listBox1.SelectedIndex); if(rect.Contains(e.Location)) { // process item data here } } }

Información sobre la versión de MouseDoubleClick :

  • .NET Framework - Incluido en: 4, 3.5, 3.0, 2.0
  • .NET Framework Client Profile: compatible con: 4, 3.5 SP1

Esto es lo que utilicé para un solo MouseClick, podría ser adaptado.

Primero, establecí las propiedades de CheckListBox.CheckOnClick en true: clb.CheckOnClick = true;

luego obligué al elemento a anular la selección después de que se cambió el estado de control de caja:

void clb_ItemCheck(object sender, ItemCheckEventArgs e) { if (clb.Items.Count > 0) { clb.SetSelected(0, false); } }