2010-09-24 45 views
10

如何在ListView中的光標下獲取項目?如何讓光標在WPF ListView下的項目

例如,當我移動鼠標光標,我希望得到它下面的一個項目(光標),並將其名稱到狀態欄。

其實我需要WinForms.NET

感謝像話getItemAt(INT X,int y)對方法!

UPD:答案被發現。手錶擴展方法如下

回答

13

您可以嘗試使用VisualTreeHelper.HitTest方法。事情是這樣的:

System.Windows.Point pt = e.GetPosition(this); 
    System.Windows.Media.VisualTreeHelper.HitTest(this, pt); 
+0

謝謝!使用你的代碼我做了一個小擴展方法。我希望有人會發現它有用 – Grigory 2010-09-28 15:52:56

12
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; 
} 
+0

嗨格里戈裏,請幫助,我想要做你到底做了什麼,但是當我粘貼你的兩個函數,我得到這個錯誤: 「擴展方法必須定義在非泛型」 – YMELS 2013-03-22 21:13:02

+2

嗨,閱讀一些關於C#中的擴展方法的文章或書籍。基本面非常重要。 如果更多的是這個問題 - 你必須把這個方法放到一個靜態類中。 – Grigory 2013-03-24 16:53:25