На ползунке есть свойство с именем 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, и это не захватывает мышь, поэтому вы можете удалить их, если хотите. Захват мыши позволяет изменять значение, даже если мышь покидает элемент управления, аналогично тому, как работают полосы прокрутки.