WPF: Como decidir a posição dos itens ao reorganizar sua ordem em um elemento ListBox?
-
27-10-2019 - |
Pergunta
Eu segui a solução para o problema de reorganização de itens fornecido por dnr3. Funciona como um encanto e é muito fácil de entender. Agora, desejo dar um passo adiante:
Digamos que ListBox
contenha os itens A, B, C, D e E. Na solução mencionada, se um ListBoxItem
for movido para baixo na lista, ele será posicionado abaixo do item no qual o drop foi executado. Portanto, se eu selecionar o item B e soltá-lo sobre o elemento D, ele ocupará o lugar de D e D se moverá um lugar para baixo. Eu quero ser capaz de fazer a diferença se o item arrastado está mais perto do limite superior ou inferior do item de destino - se estiver mais próximo do limite superior, quero que seja colocado acima do item de destino, ou abaixo se de outra forma. Preciso de duas coisas para que isso aconteça:
-
Preciso do ponto central vertical do item de destino para poder compará-lo com a posição do mouse. Isso deve ser fácil de fazer:
targetItem.Height / 2;
-
Preciso da posição do mouse em relação ao item de destino. Como faço para conseguir isso?
No final, quero comparar esses dois valores e se a posição do mouse for menor ou igual ao ponto central vertical do item, o item arrastado será solto antes do item de destino, caso contrário, abaixo.
Obrigado!
Solução
Got it! The following line retrieves the mouse position relative to target item
Point p = e.GetPosition(item);
Here's what the drop event handler should look like:
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)
...
}