【问题标题】:How to make WPF Slider Thumb follow cursor from any point如何使 WPF Slider Thumb 从任意点跟随光标
【发布时间】:2013-03-29 17:54:11
【问题描述】:

我有这样的滑块:

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

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

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

【问题讨论】:

    标签: c# .net wpf xaml slider


    【解决方案1】:

    此行为在您拖动滑块本身时才会发生,这是设计使然。

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

    挂钩到 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 时才有效。

    【讨论】:

    • 我已更新我的代码以使用 ActualWidth 而不是 Width 因为有时它是导致异常的 NaN 值。
    【解决方案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 的检查和代码会让它变成金色。
    猜你喜欢
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 2021-09-27
    相关资源
    最近更新 更多