WPF:如何处理对ListBox项目的单击?

18

在我的WPF应用程序中,我正在处理一个ListBox的SelectionChanged事件,它运行良好。

现在我需要处理一个点击事件(即使是对已选择的项目);我尝试使用MouseDown但它不起作用。如何处理ListBox上的项目点击?


这个问题在这里已经得到了回答:https://dev59.com/-XRA5IYBdhLWcg3wzhNY#821609 - bohdan_trotsenko
@modosansreves 这个问题是关于 Click 的。Click 是特殊的。显然被劫持并转变为 SelectionChanged。DoubleClick 不是... - Nate Anderson
这里有一个类似的问题,其答案是所有方法的一个很好的总结。https://dev59.com/zHM_5IYBdhLWcg3wslRW - Nate Anderson
3个回答

37

只需处理PreviewMouseDown事件:

private void listBox_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    var item = ItemsControl.ContainerFromElement(listBox, e.OriginalSource as DependencyObject) as ListBoxItem;
    if (item != null)
    {
        // ListBox item clicked - do some cool things here
    }
}

7
也许可以尝试使用PreviewMouseDown事件。而MouseDown事件会被吞噬并转换为SelectionChanged事件。
唯一的缺点是PreviewMouseDown事件会先于SelectionChanged发生。

4
列表框内部使用鼠标按下来进行选择更改。因此,您可以使用预览鼠标按下事件。
除了预览鼠标按下事件外,您还可以使用EventManager.RegisterClassHandler...
     EventManager.RegisterClassHandler(typeof(ListBoxItem), ListBoxItem.MouseLeftButtonDownEvent, new RoutedEventHandler(EventBasedMouseLeftButtonHandler));

     private static void EventBasedMouseLeftButtonHandler(object sender, RoutedEventArgs e)
     {
     }

请告诉我这是否有所帮助...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接