像VLC一样的音量滑块

5
我正在寻找一个音量滑块,它的外观和行为与VLC的滑块完全相同。 我找到了以下关于如何设置滑块样式的帖子:Volume Slider CustomControl,但我也想要相同的行为... 当你在WPF上单击滑块并将鼠标移动到滑块区域(同时仍按住鼠标键),它应该将滑块移动到鼠标在滑块上的位置。这两种行为有什么区别呢? 我找不到如何做到这一点...也许我应该使用比Slider更好的东西吗? 感谢您的帮助!

也许您可以提供一个链接,介绍一下VLC滑块及其行为是什么? - RBarryYoung
@RBarryYoung: VLC - H.B.
@RBarryYoung:我认为从问题中解释的文本中,行为是相当容易理解的,如果你不知道WPF滑块的正常行为,也很容易找到。 - H.B.
1
@Ron:例如通过处理鼠标事件。我不建议在实例级别上这样做,而且WPF滑块在功能上也不太适合,我会编写一个新的控件。 - H.B.
@H.B.:哎呀,你说得对。是我的错。 - RBarryYoung
显示剩余4条评论
1个回答

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并没有捕获鼠标,所以如果需要的话可以将其移除。捕获鼠标允许值在鼠标离开控件时仍然改变,类似于滚动条的工作原理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接