像VLC一样的Volume Slider

时间:2012-01-24 15:56:27

标签: wpf wpf-controls custom-controls slider

我正在寻找看起来和行为就像VLC滑块一样的Volume Slider enter image description here

我发现了以下有关如何设置滑块样式的帖子:Volume Slider CustomControl
但我也想要同样的行为......

行为之间有什么区别: 单击滑块[在WPF上]并在滑块区域上移动鼠标(当鼠标按钮仍然保持时),它应该将滑块也移动到滑块上鼠标的位置。

我找不到怎么做..也许我应该使用与Slider不同的东西?

感谢您的帮助!

1 个答案:

答案 0 :(得分:7)

滑块上有一个名为IsMoveToPointEnabled的属性,可将滑块设置为正确的值,但只有在您点击它时才会在拖动时更新。

要在拖动时更新,您必须在移动鼠标时自行更新值,方法Track.ValueFromPoint会为您提供正确的值,该轨道是滑块模板的一部分。

实施例

public class DraggableSlider : Slider
{
    public DraggableSlider()
    {
        this.IsMoveToPointEnabled = true;
    }

    private Track track;
    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        track = Template.FindName("PART_Track", this) as Track;
    }

    protected override void OnMouseMove(MouseEventArgs e)
    {
        base.OnMouseMove(e);
        if(e.LeftButton == MouseButtonState.Pressed && track != null)
        {
            Value = track.ValueFromPoint(e.GetPosition(track));
        }
    }


    protected override void OnPreviewMouseDown(MouseButtonEventArgs e)
    {
        base.OnPreviewMouseDown(e);
        ((UIElement)e.OriginalSource).CaptureMouse();
    }

    protected override void OnPreviewMouseUp(MouseButtonEventArgs e)
    {
        base.OnPreviewMouseUp(e);
        ((UIElement)e.OriginalSource).ReleaseMouseCapture();
    }
}

OnPreviewMouseUp / Down覆盖捕获鼠标,我尝试了VLC并且没有捕获鼠标,因此您可以根据需要删除它们。即使鼠标离开控件类似于滚动条的工作方式,捕获鼠标也可以更改值。