WPF:滑块不会引发MouseLeftButtonDown或者MouseLeftButtonUp
时间:2020-03-06 15:00:39 来源:igfitidea点击:
我尝试了这个XAML:
<Slider Width="250" Height="25" Minimum="0" Maximum="1" MouseLeftButtonDown="slider_MouseLeftButtonDown" MouseLeftButtonUp="slider_MouseLeftButtonUp" />
而这个C#:
private void slider_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { sliderMouseDown = true; } private void slider_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { sliderMouseDown = false; }
由于永远不会引发MouseLeftButtonDown和MouseLeftButtonUp事件,所以SliderMouseDown变量不会更改。当用户在滑块上按下鼠标左键以将bool值设置为true时,以及当鼠标向上时,bool设置为false时,如何使此代码起作用?
解决方案
滑块会吞下MouseDown事件(类似于按钮)。
我们可以注册PreviewMouseDown和PreviewMouseUp事件,这些事件在滑块有机会处理它们之前被触发。
另一种方法(可能更好,具体取决于方案)是在过程代码中注册一个事件处理程序,如下所示:
this.AddHandler ( Slider.MouseLeftButtonDownEvent, new MouseButtonEventHandler(slider_MouseLeftButtonDown), true );
请注意真实的论点。它基本上说我们希望接收该事件,即使该事件已被标记为已处理。不幸的是,只能通过过程代码而不是xaml来连接这样的事件处理程序。
换句话说,使用此方法,我们可以为正常事件(冒泡)注册事件处理程序,而不是通过隧道(因此发生在不同时间)进行预览的事件注册事件处理程序。
有关更多信息,请参见WPF Unleashed的第70页的"深入挖掘"侧栏。