Wpf 为什么LeftDoubleClick不适用于滑块

Wpf 为什么LeftDoubleClick不适用于滑块,wpf,slider,double-click,Wpf,Slider,Double Click,我有一个滑块,它表示音频文件中的位置。用户要求在用户双击滑块时自动播放 当我使用此选项时: <Slider.InputBindings> <MouseBinding Gesture="LeftDoubleClick" Command="{Binding PlayCommand}" /> </Slider.InputBindings> <Slider.InputBindings> <MouseBinding Gesture="

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

当我使用此选项时:

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

不调用Play命令。但是,如果我使用此选项:

<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>

调用play命令


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

好的,我想我已经知道了这里发生了什么:

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

因此,如果在第二次单击期间没有调用鼠标按下处理程序,为什么要调用
MouseDoubleClick
处理程序?事实证明,
MouseDoubleClick
源于
Control
中的类级处理程序,即使原始鼠标按下事件被标记为
Handled
,该处理程序也会被调用。请注意下面
RegisterClassHandler
的最后一个参数:

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

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

看起来是设计造成的。您应该复制滑块控件的整个模板文件,并尝试将
输入绑定
放在内部
边框
中。在许多其他控件上也会遇到此问题,例如
ListViewItem
,…有趣的。。。我想知道这个设计决定是从哪里来的。这似乎是一个相当常见的UI习惯用语……是的,事实上,我对这种奇怪的行为并不感到轻松。例如,在某些情况下无法捕获冒泡事件,因此我们无法处理冒泡事件,而是必须处理隧道事件(前缀为
Preview
)。在这种情况下,
MouseDoubleClick
会被捕获(我希望
PreviewMouseDoubleClick
),而相应的mousebinding
LeftDoubleClick
却无法捕获。