【问题标题】:Why LeftDoubleClick does not work for a slider为什么 LeftDoubleClick 不适用于滑块
【发布时间】:2014-10-15 04:38:53
【问题描述】:

我有一个表示音频文件中位置的滑块。用户要求是当用户双击滑块时自动播放。

当我使用这个时:

<Slider.InputBindings>
    <MouseBinding Gesture="LeftDoubleClick" Command="{Binding PlayCommand}" />
</Slider.InputBindings>

不调用播放命令。但是,如果我使用这个:

<Slider.InputBindings>
    <MouseBinding Gesture="RightClick" Command="{Binding PlayCommand}" />
</Slider.InputBindings>

或者这个

<Slider HorizontalAlignment="Stretch" (...)  MouseDoubleClick="slider1_MouseDoubleClick"  >
</Slider>

播放命令被调用。

什么阻止了双击手势的使用,但允许调用右键单击手势或双击事件?

【问题讨论】:

  • 看起来像是设计的。您应该复制 Slider 控件的整个模板文件,并尝试将 InputBindings 替换为内部 Border。在许多其他控件上也可能遇到此问题,例如 ListViewItem、...
  • 有趣...我想知道这个设计决定是从哪里来的。这似乎是一个相当常见的 UI 习惯用法...
  • 是的,事实上我对这种奇怪的行为并不感到轻松。比如在某些情况下无法捕获冒泡事件,因此我们无法处理冒泡事件,而是必须处理隧道事件(以Preview 为前缀)。在这种情况下,很奇怪MouseDoubleClick 可以被捕获(我期望PreviewMouseDoubleClick)而相应的鼠标绑定LeftDoubleClick 不能。

标签: wpf slider double-click


【解决方案1】:

好的,我想我已经弄清楚这里发生了什么:

Track 中的RepeatButton 正在拦截MouseLeftButtonDown 事件并设置Handled = true。请注意,MouseLeftButtonDown 事件是MouseDown 的一个分支,因此如果您将Handled 设置为一个,那么您实际上是为两者设置了它。在这种情况下,当ClickCount = 1 时正在处理鼠标按下事件,并且将事件标记为Handled 的行为可以防止这些事件的处理程序在第二次单击时被调用(即,当ClickCount = 2 时)。输入手势在MouseDown 事件上进行评估,因此抑制MouseDown 处理程序进行第二次点击意味着Slider 不会被探测输入绑定,并且带有双击手势的命令将永远没有机会执行.

那么,如果鼠标按下的处理程序在第二次单击期间没有被调用,为什么MouseDoubleClick 处理程序会被调用?好吧,事实证明MouseDoubleClick 源自Control 中的类级处理程序,并且该处理程序被调用即使最初的鼠标按下事件被标记为Handled .请注意下面RegisterClassHandler 的最后一个参数:

EventManager.RegisterClassHandler(
    typeof(Control),
    UIElement.MouseLeftButtonDownEvent,
    new MouseButtonEventHandler(HandleDoubleClick),
    /* handledEventsToo: */ true);

因此即使LeftDoubleClick 输入绑定从未有机会执行,也会引发MouseDoubleClick 事件。这可能不是最直观的行为,我不确定这是有意识的设计决定还是简单的疏忽。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 2012-07-23
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多