WPF: Como decidir a posição dos itens ao reorganizar sua ordem em um elemento ListBox?

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

  •  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:

  1. 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;

  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!

Foi útil?

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)
    ...
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top