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
),而相应的mousebindingLeftDoubleClick
却无法捕获。