3

当用户单击任何给定ListBox项目时,我想运行一些代码。我的设置是ListBox带有自定义ItemsPanelTemplate的(Pavan 的 ElementFlow)。根据进入的位置数据,MouseLeftButtonDown有没有办法判断点击了哪个项目?custom 使这变得更加困难(或更令人困惑)ItemsPanelTemplate

4

1 回答 1

12

您可以拥有一个 ItemContainerStyle,并在其中指定一个 EventSetter:

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

然后,在 MouseLeftButtonDown 的处理程序中,“发送者”将是 ListBoxItem。

另外,如果你不想使用这个方法,你可以调用 HitTest 来找出指定位置的 Visual 对象:

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;
}
于 2009-08-26T16:01:32.440 回答