2013-04-07 72 views
3

我有这样的滑块:如何使WPF滑块跟随光标从任何一点

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

我要让未来的行为: 时的MouseDown发生在滑块的任何一点,大拇指不仅是移动一次到点,但也跟随光标,直到出现鼠标上。

对不起,如果它已被问到,我找不到这个问题。

回答

3

此行为将会发生只有当您拖动滑块本身时,它是通过设计。

然而,这里的一些代码,将做到这一点;-)

钩到MouseMove事件中的XAML:

<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时才起作用。
+0

非常感谢你) – 2013-04-08 11:42:44

+0

我更新了我的代码,使用ActualWidth而不是Width,因为它有时是一个NaN值,会导致异常。 – Aybe 2013-04-11 16:21:34

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; 

    } 
} 
+0

这很好,但是对于Slider.Orientation = Orientation.Vertical的检查和代码会让它变得金黄。 – TernaryTopiary 2016-09-23 08:14:45