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页的"深入挖掘"侧栏。