2009-08-26 2 views
2

Я хочу запустить код, когда пользователь нажимает на любой заданный ListBox элемент. Моя настройка - ListBox с пользовательским номером ItemsPanelTemplate (ElementFlow от Pavan). На основе данных о местоположении, которые входят в MouseLeftButtonDown, есть ли способ узнать, какой элемент был нажат? Это делается немного сложнее (или более запутанно) по обычаю ItemsPanelTemplate.Получить элемент списка ListView WPF из MouseLeftButtonDown

ответ

11

Вы можете иметь ItemContainerStyle и указать в нем EventSetter:

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

Затем в обработчике в MouseLeftButtonDown, то «отправитель» будет ListBoxItem.

ТАКЖЕ, если вы не хотите использовать этот метод, вы можете вызвать HitTest, чтобы узнать визуальный объект в указанной позиции:

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

Вау, отлично! Но, похоже, это должно быть {x: Type ListBoxItem}. – Mike

+0

Спасибо! Я починил это. – decasteljau

Смежные вопросы