首页 > 解决方案 > WPF:为什么 PreviewMouseLeftButtonDown EventTrigger 有效而 MouseLeftButtonDown 无效?

问题描述

请看这个EventTrigger

<ListView Name="ListViewFiles">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="PreviewMouseLeftButtonDown">
            <i:InvokeCommandAction Command="{Binding ListViewItemMouseLeftButtonDownCommand}"
                                   CommandParameter="{Binding ElementName=ListViewFiles, Path=SelectedItem}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ListView>

所以我想实现两件事:

  1. 我尝试使用MouseLeftButtonDown 而不是,PreviewMouseLeftButtonDown但事件没有被触发(为什么??)。
  2. 当用户单击并按住左按钮时,我希望事件在milliseconds我当前使用的 500 之后触发timer- 还有其他方法吗?

标签: wpfeventtrigger

解决方案


MouseLeftButtonDown由于 WPF 处理RoutedEvents. 当 aRoutedEvent被标记为“已处理”时,WPF 不会为它调用任何进一步的事件处理程序。

ListView几乎肯定MouseLeftButtonDown是在内部处理,可能是为了更改所选项目。因为MouseLeftButtonDown是一个冒泡事件,这意味着它在ListView将可视化树添加到您的代码之前在内部被标记为已处理,因此它永远不会到达。

PreviewMouseLeftButtonDown另一方面,它是一个隧道事件,因此它进入ListView.

至于你问题的第二部分,我不知道有什么比使用某种计时器更好的方法来触发代码。此外,如果您只想在他们按住按钮一段时间后触发它,请确保您处理PreviewLeftMouseButtonUp事件以关闭计时器,如果他们在时间结束之前释放按钮。


推荐阅读