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
2
A
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;
}
Wow, perfekt! Aber es sollte stattdessen {x: Type ListBoxItem} sein. – Mike
Danke! Ich habe es repariert. – decasteljau