像VLC一样的Volume Slider

Ron*_*Ron 5 wpf slider custom-controls wpf-controls

我正在寻找体积滑块,其外观和行为就像VLC的滑块一样.
在此输入图像描述

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

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

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

谢谢您的帮助!

Kri*_*is 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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