WPF:Slider不会引发MouseLeftButtonDown或MouseLeftButtonUp

我试过这个XAML:

 

这个C#:

 private void slider_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { sliderMouseDown = true; } private void slider_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { sliderMouseDown = false; } 

sliderMouseDown变量永远不会更改,因为从不引发MouseLeftButtonDown和MouseLeftButtonUp事件。 当用户在滑块上按下鼠标左键以将bool值设置为true时,如何使用此代码,并且当鼠标启动时,bool设置为false?

滑块吞下MouseDown事件(类似于按钮)。

您可以注册要在滑块有机会处理它们之前触发的PreviewMouseDown和PreviewMouseUp事件。

另一种方法(根据您的方案可能更好)是在过程代码中注册事件处理程序,如下所示:

 this.AddHandler ( Slider.MouseLeftButtonDownEvent, new MouseButtonEventHandler(slider_MouseLeftButtonDown), true ); 

请注意真实的论点。 它基本上表示您希望接收该事件,即使它已被标记为已处理。 不幸的是,连接像这样的事件处理程序只能从过程代码而不是从xaml完成。

换句话说,使用此方法,您可以为正常事件(气泡)注册事件处理程序,而不是隧道(因此在不同时间发生)的预览事件。

有关详细信息,请参阅WPF Unleashed第70页的Digging Deeper侧栏。

尝试使用LostMouseCapture和GotMouseCapture。

  private void sliderr_LostMouseCapture(object sender, MouseEventArgs e) private void slider_GotMouseCapture(object sender, MouseEventArgs e) 

GotMouseCapture在用户开始拖动滑块时触发,而LostMouseCapture在释放滑块时触发。

我想提一下Slider并没有完全吞下整个MouseDown事件。 通过单击刻度线,您可以收到有关该事件的通知。 Slider不会处理MouseDown事件,除非它们来自滑块的…滑块。

基本上如果你决定使用

 AddHandler(Slider.MouseLeftButtonDownEvent, ..., true) 

打开滴答的版本,请确保事先处理过该事件。 如果你不这样做,你最终会得到一个你认为滑块被点击的边缘情况,但它实际上是一个勾号。 注册预览活动更糟糕 – 你可以在任何地方接收活动,即使是在刻度线之间的白色空间。