WPF: come decidere la posizione degli elementi riorganizzando il loro ordine in un elemento ListBox?
-
27-10-2019 - |
Domanda
Ho seguito la soluzione al problema di riorganizzazione degli elementi fornito da dnr3. Funziona come un incantesimo ed è molto facile da capire. Ora, desidero fare un ulteriore passo avanti:
Diciamo che ListBox
contiene gli elementi A, B, C, D ed E. Nella soluzione citata, se un ListBoxItem
viene spostato in basso nell'elenco, viene posizionato sotto l'elemento su cui è stato eseguito il drop. Quindi, se seleziono l'elemento B e lo rilascio sopra l'elemento D, prenderà il posto di D e D si sposterà di una posizione verso il basso. Voglio essere in grado di fare la differenza se l'elemento trascinato è più vicino al limite superiore o inferiore elemento di destinazione - se è più vicino al limite superiore voglio che sia posizionato sopra l'elemento di destinazione, o sotto se altrimenti. Ho bisogno di due cose per farlo accadere:
-
Ho bisogno del punto centrale verticale dell'elemento di destinazione per poterlo confrontare con la posizione del mouse. Dovrebbe essere facile:
targetItem.Height / 2;
-
Ho bisogno della posizione del mouse rispetto all'elemento di destinazione. Come posso ottenerlo?
Alla fine voglio confrontare questi due valori e se la posizione del mouse è minore o uguale al punto centrale verticale dell'elemento, l'elemento trascinato deve essere rilasciato prima dell'elemento target, altrimenti sotto.
Grazie!
Soluzione
Capito!La riga seguente recupera la posizione del mouse rispetto all'elemento di destinazione
Point p = e.GetPosition(item);
Ecco come dovrebbe apparire il gestore di eventi di rilascio:
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)
...
}