WPF: ¿Cómo decidir la posición de los elementos al reorganizar su orden en un elemento ListBox?

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

  •  27-10-2019
  •  | 
  •  

Pregunta

Seguí la solución al problema de reorganización de elementos proporcionado por dnr3. Funciona a las mil maravillas y es muy fácil de entender. Ahora, deseo ir un paso más allá:

Digamos que ListBox contiene los elementos A, B, C, D y E. En la solución mencionada, si un ListBoxItem se mueve hacia abajo en la lista, se coloca debajo del elemento en el que se ejecutó la colocación. Entonces, si selecciono el elemento B y lo suelto sobre el elemento D, tomará el lugar de D y D se moverá un lugar hacia abajo. Quiero poder marcar la diferencia si el elemento arrastrado está más cerca del límite superior o inferior del elemento de destino ; si está más cerca de la parte superior, quiero que se coloque encima del elemento de destino, o debajo si de otra manera. Necesito dos cosas para que eso suceda:

  1. Necesito el punto central vertical del elemento de destino para poder compararlo con la posición del mouse. Eso debería ser fácil de hacer:

    targetItem.Height / 2;

  2. Necesito la posición del mouse en relación con el elemento de destino. ¿Cómo lo consigo?

Al final, quiero comparar esos dos valores y si la posición del mouse es menor o igual que el punto central vertical del elemento, entonces el elemento arrastrado se coloca antes del elemento de destino, de lo contrario, debajo.

¡Gracias!

¿Fue útil?

Solución

¡Entendido!La siguiente línea recupera la posición del mouse relativa al elemento de destino
Point p = e.GetPosition(item);

Así es como debería verse el controlador de eventos de caída:

private void PlaylistListBoxItem_Drop(object sender, DragEventArgs e)
{
    ...
    ListBoxItem item;
    int centerY;
    Point p;

    item = sender as ListBoxItem;
    centerY = item.Height / 2;
    p = e.GetPosition(item);

    if (p.Y <= centerY)
    ...
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top