【问题标题】:WPF: why PreviewMouseLeftButtonDown EventTrigger works and MouseLeftButtonDown not?WPF:为什么 PreviewMouseLeftButtonDown EventTrigger 有效而 MouseLeftButtonDown 无效?
【发布时间】:2019-12-01 12:35:52
【问题描述】:

请看这个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. 当用户单击并按住左键时,我希望事件在 500 milliseconds 之后触发,目前我正在使用 timer - 还有其他方法吗?

【问题讨论】:

    标签: wpf eventtrigger


    【解决方案1】:

    MouseLeftButtonDown 可能没有激活您的触发器,因为 WPF 处理 RoutedEvents 的方式。当 RoutedEvent 被标记为“已处理”时,WPF 不会为它调用任何进一步的事件处理程序。

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

    另一方面,PreviewMouseLeftButtonDown 是一个tunneling 事件,因此它在进入ListView 之前到达您的代码。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-09
      • 2011-07-05
      • 2012-01-15
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多