How to stop update value of slider while dragging it?

后端 未结 5 2514
遥遥无期
遥遥无期 2021-02-20 12:21

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 f

5条回答
  •  遥遥无期
    2021-02-20 13:02

    Neither of the answers worked for me - the first one wouldn't slide, and the second still updated a bound value during sliding (which is what the question was asking - I think). I ended up sub-classing Slider to include a dependency property for a second bound value (Value2, for want of a better name), which does not get updated whilst the Slider is being dragged. All other value updates are reflected, and the value is also updated once the drag completes. There are probably some gaping holes in this class, but it is seems to be working fine for my purposes.

    public class SliderNoDragUpdates : Slider
    {
        public static readonly DependencyProperty Value2Property =
            DependencyProperty.RegisterAttached(
                "Value2",
                typeof(double),
                typeof(SliderNoDragUpdates),
                new FrameworkPropertyMetadata(0D, new PropertyChangedCallback(OnValue2Changed), new CoerceValueCallback(CoerceValue2))
                {
                    BindsTwoWayByDefault = true,
                });
    
        private static object CoerceValue2(DependencyObject d, object value)
        {
            SliderNoDragUpdates c = (SliderNoDragUpdates)d;
            double v = (double)value;
            if (v < c.Minimum) v = c.Minimum;
            if (v > c.Maximum) v = c.Maximum;
            return v;
        }
    
        private static void OnValue2Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            d.CoerceValue(Value2Property);
        }
    
        public double Value2
        {
            get { return (double)this.GetValue(Value2Property); }
            set
            {
                if (value != Value2)
                    this.SetValue(Value2Property, value);
                if (value != Value)
                    this.SetValue(ValueProperty, value);
            }
        }
    
        private bool _dragging = false;
    
        protected override void OnThumbDragStarted(System.Windows.Controls.Primitives.DragStartedEventArgs e)
        {
            _dragging = true;
    
            base.OnThumbDragStarted(e);
        }
    
        protected override void OnThumbDragCompleted(System.Windows.Controls.Primitives.DragCompletedEventArgs e)
        {
            _dragging = false;
            Value2 = Value;
    
            base.OnThumbDragCompleted(e);
        }
    
        protected override void OnValueChanged(double oldValue, double newValue)
        {
            if (!_dragging)
                Value2 = Value;
    
            base.OnValueChanged(oldValue, newValue);
        }
    }
    

    To use it, instantiate a SliderNoDragUpdates in place of a normal Slider, and bind to Value2 instead of Value (or, indeed - bind to both, so that you can see the value update in a cheap-to-update field, whilst waiting for the drag to complete before starting your expensive operation).

    
    
        
            
            
        
        
        
            
                
                
            
        
    
    

提交回复
热议问题