2010-09-24 10 views
10

Come ottenere l'elemento sotto il cursore in ListView?Come ottenere l'elemento sotto il cursore in WPF ListView

Ad esempio quando si sposta il cursore del mouse, desidero ottenere un elemento sotto di esso (cursore) e inserire il suo nome nella barra di stato.

realtà ho bisogno metodo come getItemAt (int x, int y) in WinForms.NET

Grazie!

UPD: La risposta è stata trovata. Guarda il metodo di estensione sotto

risposta

13

Puoi provare a utilizzare il metodo VisualTreeHelper.HitTest. Qualcosa di simile a questo:

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

Grazie! Usando il tuo codice ho fatto un piccolo metodo di estensione. Spero che qualcuno lo trovi utile – Grigory

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

Ciao Grigory, per favore aiuto, voglio fare esattamente quello che hai fatto, ma quando ti ho incollato due funzioni ho ricevuto questo errore: "Il metodo di estensione deve essere definito in modo non generico" – YMELS

+2

Ciao , leggi alcuni articoli o un libro sui metodi di estensione in C#. I fondamentali sono piuttosto importanti. Se si vuole essere di più a questo problema - devi mettere questo metodo in una classe statica. – Grigory

Problemi correlati