WPF:Slider不会引发MouseLeftButtonDown或MouseLeftButtonUp

时间:2008-10-02 05:25:39

标签: c# wpf slider mouseevent

我试过这个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,我该如何使用此代码?

4 个答案:

答案 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)
打开勾号的

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