none
ListBoxItem的Click事件在哪? RRS feed

  • 问题

  • 我需要在ListBox选中一个Item之后运行一段代码,不能用SelectionChange事件,因为用户有可能重复点击同一个Item。

    然后我才发现ListBox没有这样的事件?我尝试用MouseDown,但是发现在Item上点击鼠标的时候,根本不会触发ListBox的Mousedown事件。。。

    有什么好建议吗?


    da jia hao!

    2017年9月6日 7:24

全部回复

  • Hi,

    >> 我需要在ListBox选中一个Item之后运行一段代码,不能用SelectionChange事件,因为用户有可能重复点击同一个Item。

    你可以尝试在处理PreviewMouseLeftButtonDown事件,该事件现在鼠标右键按下事发生。

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

    用户重发点击同一个Item是不可避免的,你可以尝试在点击之后禁用这个Item。

    <Style TargetType="{x:Type ListBoxItem}">
        <Setter Property="IsEnabled" Value="{Binding IsEnabled}"/>
    </Style>

    https://msdn.microsoft.com/en-us/library/system.windows.controls.listboxitem(v=vs.110).aspx#Events

    Best Regards,

    Bob





    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年9月6日 7:53
    版主
  • 可是我的ListBox,ItemContainerStyle是在一个模版中定义的,并不是直接写在<ListBox>里面。还能添加EventSetter吗?


    da jia hao!


    • 已编辑 liubin 2017年9月6日 9:31
    2017年9月6日 9:29
  • Hi,

    你可以在样式中指定事件的。

     <Style x:Key="CustomItemContainerStyle" TargetType="{x:Type ListBoxItem}">
            <EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListBoxItem_PreviewMouseLeftButtonDown"/>
    
    ....
    </Style>

    Best Regards,

    Bob


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年9月6日 9:40
    版主
  • 那我如果用了多个ListBox,是不是这些ListBox的单击事件处理程序都是这一个:
    ListBoxItem_PreviewMouseLeftButtonDown

    da jia hao!

    2017年9月6日 9:44
  • 我這樣寫,编译时报错(我把“ListBoxItem_PreviewMouseLeftButtonDown”方法写在了.cs文件中)


    da jia hao!

    2017年9月6日 9:50
  • 你好,

    问题是您的事件处理程序需要在文件后面的代码中实现,但是由于您的xaml文件没有任何* .cs文件,所以VS不知道应该在哪里实现事件处理程序。

    要解决这个问题,您需要把样式放到一个资源文件中,然后为这个资源文件添加后台代码类,然后可以在xaml文件中定义“x:class”属性。之后,您应该可以定义事件处理程序。

    <ResourceDictionary
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 x:Class="WpfApplication1.CustomResources"
                 xmlns:local="clr-namespace:WpfApplication1">
    
        <Style  TargetType="{x:Type ListBoxItem}">
            <EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListBoxItem_PreviewMouseLeftButtonDown"/> 
         </Style>
    </ResourceDictionary>
    using System;
    using System.Windows;
    namespace WpfApplication1
    {
        public partial class CustomResources : ResourceDictionary
        {
            private void ListBoxItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
            {
     //...
            }
        }
    }

    注意,后台文件和资源字典文件放在同一目录下。


    Best Regards,

    Bob


    2017年9月6日 10:07
    版主
  • 谢谢,我尝试下。

    另外,我有个疑问。就是,在WinForm里面,listbox的onclick事件是默认就有的,使用非常方便。

    为什么到了WPF,却变得这么复杂?


    da jia hao!

    2017年9月7日 3:42
  • HI,

    >>另外,我有个疑问。就是,在WinForm里面,listbox的onclick事件是默认就有的,使用非常方便。为什么到了WPF,却变得这么复杂?

    WPF和WinForm是两种完全不同的技术,WinForm基于事件驱动,所以事件用的才那么频繁,而WPF基于数据驱动,WPF的数据绑定让WPF适用于MVVM模式, 把逻辑代码放到ViewModel中,View的后台代码甚至可以没有代码,在MVVM模式中通常使用命令来取代事件,甚至可以不使用任何事件。

    Best Regards,

    Bob


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2017年9月7日 4:00
    版主