如何使WPF Slider Thumb从任何点跟随光标

时间:2013-04-07 17:52:30

标签: c# .net wpf xaml slider

我有这样的滑块:

<Slider Minimum="0" Maximum="100" 
TickFrequency="1"
IsMoveToPointEnabled="True"
IsSnapToTickEnabled="False"/>

我想做下一个行为:  当MouseDown在滑块的任何位置出现时,Thumb不仅会移动一次到该点,而且还会跟随光标直到MouseUp发生。

对不起,如果已经问过,我找不到那个问题。

2 个答案:

答案 0 :(得分:3)

当你拖动滑块拇指本身时,这种行为只会发生 ,这是设计的。

然而,这里有一些代码会执行此操作; - )

在XAML中挂钩到MouseMove事件:

<Slider MouseMove="Slider_OnMouseMove" IsMoveToPointEnabled="True"/>

然后插入此代码:

private void Slider_OnMouseMove(object sender, MouseEventArgs e)
{
    if (e.LeftButton == MouseButtonState.Pressed)
    {
        var slider = (Slider)sender;
        Point position = e.GetPosition(slider);
        double d = 1.0d / slider.ActualWidth * position.X;
        var p = slider.Maximum * d;
        slider.Value = p;
    }
}

注意:

  • 如果它们不同,您可能需要考虑滑块的边距和填充,我没有。
  • 这是在水平滑块上完成的。
  • 我的滑块的最小值为0,如果最小值为负,请务必调整计算。
  • 最后,它似乎只在设置了IsMoveToPointEnabled时才有效。

答案 1 :(得分:1)

Aybe的解决方案在thumb_MouseMove事件中效果更好。

void timelineThumb_MouseMove(object sender, MouseEventArgs e)
{

     if (e.LeftButton == MouseButtonState.Pressed)
     {
         var thumb = sender as Thumb;

         Point pos = e.GetPosition(uiVideoPlayerTimelineSlider);
         double d = 1.0d / uiVideoPlayerTimelineSlider.ActualWidth * pos.X;
         uiVideoPlayerTimelineSlider.Value = uiVideoPlayerTimelineSlider.Maximum * d;

     }
}