How to stop update value of slider while dragging it?

yossharel picture yossharel · Nov 10, 2010 · Viewed 11k times · Source

I've slider that its value is bind to some property, and the property updates it all the time. While dragging the [thumb on] slider I want to stop this update value of slider from binding, until user finish it's dragging.

Is there any property on Slider to do that, or I need to write code for that?

Thanks in advance!

Answer

Ray Burns picture Ray Burns · Nov 10, 2010

The template for Slider includes a Thumb, which raises the ThumbDragDelta event as the mouse is moved. Slider will always update the bound value immediately when it receives a ThumbDragDelta event.

The trick is to stop this event. The easiest way is to subclass Slider:

public class SliderIgnoreDelta : Slider
{
  protected override void OnThumbDragDelta(DragDeltaEventArgs e)
  {
    // Do nothing
  }
}

This slider will not update the value until the thumb drag completes.

Another solution is to intercept the ThumbDragDelta event on the Thumb. If you happen to be re-templating the Slider anyway, this might be a better solution. For example if you already have an EventBlocker class coded up that sets Handled true on the given RoutedEvent, you could put this in your template:

<Track.Thumb>
  <Thumb my:EventBlocker.EventToBlock="{x:Static Thumb.DragDeltaEvent}" />
</Track.Thumb>

But for most cases you'll probably want to go with my first solution.