Ответ 1
Вы можете попробовать использовать метод VisualTreeHelper.HitTest. Что-то вроде этого:
System.Windows.Point pt = e.GetPosition(this);
System.Windows.Media.VisualTreeHelper.HitTest(this, pt);
Как получить элемент под курсором в ListView?
Например, когда я перемещаю курсор мыши, я хочу получить под ним элемент (курсор) и поместить его имя в строку состояния.
На самом деле мне нужен такой метод, как GetItemAt (int x, int y) в WinForms.NET
Спасибо!
UPD: Ответ был найден. Смотрите метод расширения ниже
Вы можете попробовать использовать метод VisualTreeHelper.HitTest. Что-то вроде этого:
System.Windows.Point pt = e.GetPosition(this);
System.Windows.Media.VisualTreeHelper.HitTest(this, pt);
public static object GetObjectAtPoint<ItemContainer>(this ItemsControl control, Point p)
where ItemContainer : DependencyObject
{
// ItemContainer - can be ListViewItem, or TreeViewItem and so on(depends on control)
ItemContainer obj = GetContainerAtPoint<ItemContainer>(control, p);
if (obj == null)
return null;
return control.ItemContainerGenerator.ItemFromContainer(obj);
}
public static ItemContainer GetContainerAtPoint<ItemContainer>(this ItemsControl control, Point p)
where ItemContainer : DependencyObject
{
HitTestResult result = VisualTreeHelper.HitTest(control, p);
DependencyObject obj = result.VisualHit;
while (VisualTreeHelper.GetParent(obj) != null && !(obj is ItemContainer))
{
obj = VisualTreeHelper.GetParent(obj);
}
// Will return null if not found
return obj as ItemContainer;
}
Я использовал эту ссылку вместо этого: https://www.codeproject.com/Articles/24072/Very-Simple-WPF-Drag-and-Drop-Sample-without-Win32
Это позволяет избежать вызовов Win32 и намного проще, чем я вижу здесь.