Ползунок - привязка к точке и перетаскивание с событиями

Мне нужно вызвать событие, когда ползунок ползунка либо перетаскивается на новое значение, либо щелкается до нового значения с привязкой к точке. Я хочу, чтобы это событие происходило только при изменении значения этими двумя способами с использованием мыши, поэтому событие ValueChanged не сработает.


person Wilson    schedule 27.01.2013    source источник


Ответы (1)


ты можешь попробовать этот маленький трюк

сначала вам нужно установить UpdateSourceTrigger на Explicit

<Slider Minimum="0"
        Thumb.DragStarted="Slider_DragStarted"
        Thumb.DragCompleted="Slider_DragCompleted"
        Maximum="{Binding YourMaxBinding, Mode=OneWay}"
        Value="{Binding CurrentPosition, Mode=TwoWay, UpdateSourceTrigger=Explicit}" />

код позади

private void Slider_DragStarted(object sender, System.Windows.Controls.Primitives.DragStartedEventArgs e) {
    // try to prevent updating slider position from your view model
    yourViewModel.DontUpdateSliderPosition = true;
}

private void Slider_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e) {
    BindingExpression be = ((Slider)sender).GetBindingExpression(RangeBase.ValueProperty);
    if (be != null) {
      be.UpdateSource();
    }
    yourViewModel.DontUpdateSliderPosition = false;
}

код в вашей модели просмотра

private bool _dontUpdateSliderPosition;
public bool DontUpdateSliderPosition {
    get {
        return _dontUpdateSliderPosition;
    }
    set {
        if (Equals(value, _dontUpdateSliderPosition)) {
            return;
        }
        _dontUpdateSliderPosition = value;
        yourPropertyChangedFunc("DontUpdateSliderPosition");
    }
}

private int _currentPosition;
public int CurrentPosition {
    get {
        return _currentPosition;
    }
    set {
        if (Equals(value, _currentPosition)) {
            return;
        }
        _currentPosition = value;
        yourPropertyChangedFunc("CurrentPosition");
    }
}

private CodeBehindFuncToChangeTheSliderPosition(){
    if (!DontUpdateSliderPosition) {
        CurrentPosition = theNewPosition;
    }
}

надеюсь это поможет

person punker76    schedule 27.01.2013