如何使WPF滑块拇指从任意点跟随鼠标?

3

我有这样的滑块:

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

我希望实现以下操作:当鼠标在滑块的任意位置按下时,拇指不仅应该移动到该位置,而且还应该跟随光标移动,直到鼠标弹起。

如果这个问题已经被问过了,那么很抱歉,我没有找到相关的问题。

2个回答

4

这种行为只会在你拖动滑块本身时发生,这是设计上的问题。

然而,这里有一些代码可以做到这一点 ;-)

在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
我已更新我的代码,使用ActualWidth代替Width,因为有时它是一个NaN值,会导致异常。 - aybe

2
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;

     }
}

很不错,但是如果加上一个检查和代码来处理Slider.Orientation = Orientation.Vertical的情况,那就更完美了。 - TernaryTopiary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接