Reputation: 1922
How to get Item under cursor in ListView ?
For example when i move mouse cursor, i wish to get an item under it(cursor) and put its name to statusbar.
Actually i need method like GetItemAt(int x,int y) in WinForms.NET
Thanks!
UPD: Answer was found. Watch extension method below
Upvotes: 13
Views: 13291
Reputation: 1922
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;
}
Upvotes: 16
Reputation: 4563
You can try using the VisualTreeHelper.HitTest method. Something like this:
System.Windows.Point pt = e.GetPosition(this);
System.Windows.Media.VisualTreeHelper.HitTest(this, pt);
Upvotes: 17