Получить элемент списка WPF из MouseLeftButtonDown - PullRequest
3 голосов
/ 26 августа 2009

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

1 Ответ

12 голосов
/ 26 августа 2009

Вы можете иметь 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;
}
...