如何使WPF滑块拇指跟随光标从任何一点

本文关键字:光标 跟随 任何一 何使 WPF | 更新日期: 2023-09-27 18:08:00

我有这样的滑块:

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

我想做下一个行为:当滑块的任何一点发生MouseDown时,拇指不仅向该点移动一次,而且还跟随光标移动一次,直到发生MouseUp。

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

如何使WPF滑块拇指跟随光标从任何一点

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

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

钩子到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设置。

也许这个解决方案在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;
     }
}