我试过这个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;
}
sliderMouseDown变量永远不会更改,因为永远不会引发MouseLeftButtonDown和MouseLeftButtonUp事件。如果用户在滑块上按下鼠标左键以将bool值设置为true,并且当鼠标处于启动状态时,bool设置为false,我该如何使用此代码?
答案 0 :(得分:19)
另一种方法(根据你的场景可能更好)是在程序代码中注册一个事件处理程序,如下所示:
this.AddHandler
(
Slider.MouseLeftButtonDownEvent,
new MouseButtonEventHandler(slider_MouseLeftButtonDown),
true
);
请注意真实的论点。 它基本上表示您希望接收该事件,即使它已被标记为已处理。不幸的是,连接这样的事件处理程序只能通过过程代码而不是来自xaml。
换句话说,使用此方法,您可以为正常事件(气泡)注册事件处理程序,而不是隧道的预览事件(因此在不同时间发生)。
有关详细信息,请参阅 WPF Unleashed 第70页的“深入挖掘”侧栏。
答案 1 :(得分:17)
滑块吞下MouseDown事件(类似于按钮)。
您可以注册PreviewMouseDown和PreviewMouseUp事件,这些事件会在滑块有机会处理之前被触发。
答案 2 :(得分:4)
尝试使用LostMouseCapture和GotMouseCapture。
private void sliderr_LostMouseCapture(object sender, MouseEventArgs e)
private void slider_GotMouseCapture(object sender, MouseEventArgs e)
GotMouseCapture在用户开始拖动滑块时触发,而LostMouseCapture在释放滑块时触发。
答案 3 :(得分:1)
我想提一下Slider并没有完全吞下整个MouseDown事件。通过单击刻度线,可以收到有关该事件的通知。 Slider不会处理MouseDown事件,除非它们来自滑块的......滑块。
基本上如果您决定使用
AddHandler(Slider.MouseLeftButtonDownEvent, ..., true)
打开勾号的版本,请确保先前已处理过该事件。如果你不这样做,你最终会得到一个你认为滑块被点击的边缘情况,但实际上是一个勾号。注册预览活动更糟糕 - 你可以在任何地方接收活动,即使是在刻度线之间的白色空间。