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