WPF ListBox IndexFromPoint - PullRequest
       2

WPF ListBox IndexFromPoint

4 голосов
/ 06 августа 2011

Я выполняю перетаскивание между списками WPF ListBox, и я хотел бы иметь возможность вставлять в коллекцию позицию, в которой она была удалена, а не конец списка.

Кто-нибудь знает решение, подобное функции WinForms ListBox IndexFromPoint?

Ответы [ 3 ]

6 голосов
/ 06 августа 2011

В итоге я получил эту работу, используя комбинацию DragDropEvent.GetPosition, VisualTreeHelper.GetDescendantBounds и Rect.Contains. Вот что я придумал:

int index = -1;
for (int i = 0; i < collection.Count; i++)
{
   var lbi = listBox.ItemContainerGenerator.ContainerFromIndex(i) as ListBoxItem;
   if (lbi == null) continue;
   if (IsMouseOverTarget(lbi, e.GetPosition((IInputElement)lbi)))
   {
       index = i;
       break;
   }
}

Код находится в событии ListBox Drop. Объект e - это объект DragEventArgs, переданный в событие Drop.

Реализация для IsMouseOverTarget:

private static bool IsMouseOverTarget(Visual target, Point point)
{
    var bounds = VisualTreeHelper.GetDescendantBounds(target);
    return bounds.Contains(point);
}
3 голосов
/ 06 августа 2011

Вы можете использовать

itemsControl.InputHitTest(position).

Идите вверх по визуальному дереву оттуда, пока не дойдете до нужного ItemContainer (для ListBox вы найдете ListBoxItem и т. Д ....)

Затем вызовите

itemsControl.ItemContainerGenerator.IndexFromContainer(listBoxItem) 

, чтобы получить индекс для вставки.

1 голос
/ 20 марта 2016

Вот как я это делаю - без драмы с повторением списка и т. Д.

//Get the position
var currp = e.GetPosition(dgrid);
//Get whats under that position
var elem=dgrid.InputHitTest(currp);
//Your ListView or DataGrid will have set the DataContext to your bound item 
if (elem is FrameworkElement && (elem as FrameworkElement).DataContext != null)
{
  var target=dgrid.ItemContainerGenerator.ContainerFromItem((elem as FrameworkElement).DataContext)
}

В этом суть - вы можете затем использовать ItemContainerGenerator.ContainerFromItem или / и IndexFromContainer для получения индекса - но я подозреваю, что большинствохочу использовать Item

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...