2009-08-26 18 views
2

Ich möchte etwas Code ausführen, wenn der Benutzer auf einen gegebenen ListBox Artikel einzeln klickt. Mein Setup ist ein ListBox mit einem benutzerdefinierten ItemsPanelTemplate (Pavan's ElementFlow). Basierend auf den Positionsdaten, die in MouseLeftButtonDown enthalten sind, gibt es eine Möglichkeit zu sagen, auf welches Objekt geklickt wurde? Dies wird durch die benutzerdefinierte ItemsPanelTemplate etwas schwieriger (oder verwirrender) gemacht.Holen Sie sich ein WPF-ListBox-Element von MouseLeftButtonDown

Antwort

11

Sie können eine ItemContainerStyle haben und eine Eventsetter darin angeben:

<ListBox> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ListBoxItem}"> 
      <EventSetter Event="MouseLeftButtonDown" Handler="ListBoxItem_MouseLeftButtonDown" /> 
    ... 

Dann wird in dem Handler des Mouseleftbuttondown, der "Sender" wird die ListBoxItem sein.

AUCH, wenn Sie diese Methode nicht verwenden möchten, können Sie HitTest rufen Sie das Visual-Objekt an einer bestimmten Position, um herauszufinden:

HitTestResult result = VisualTreeHelper.HitTest(myCanvas, pt); 

ListBoxItem lbi = FindParent<ListBoxItem>(result.VisualHit); 

public static T FindParent<T>(DependencyObject from) 
    where T : class 
{ 
    T result = null; 
    DependencyObject parent = VisualTreeHelper.GetParent(from); 

    if (parent is T) 
     result = parent as T; 
    else if (parent != null) 
     result = FindParent<T>(parent); 

    return result; 
} 
+0

Wow, perfekt! Aber es sollte stattdessen {x: Type ListBoxItem} sein. – Mike

+0

Danke! Ich habe es repariert. – decasteljau