滑块 - 对齐点并使用事件拖动

本文关键字:事件 拖动 对齐 滑块 | 更新日期: 2023-09-27 17:56:26

当滑块的拇指拖动到新值或使用对齐点单击到新值时,我需要触发一个事件。我只希望当值更改时发生此事件是这两种方式,使用鼠标,因此 ValueChanged 事件将不起作用。

滑块 - 对齐点并使用事件拖动

你可以试试这个技巧

首先,您需要将 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;
    }
}

希望这有帮助