6

XAMLには。があり<Slider />ます。ValueChangedイベントがあります。このイベントは、Valueが変更されるたびに発生します。値の変更がいつ終了したかを検出する必要があります。LostFocus、PointerReleasedは正しいイベントではありません。どうすればこれを検出できますか?

4

4 に答える 4

10

XAML、WinRT、Windows8.1、およびUWP:

PointerCaptureLostイベントは、マウス/ キーボードのタッチ
KeyUpイベントで機能するはずです

于 2015-06-16T09:12:28.510 に答える
7

新しいクラスを作成して、Sliderから継承できます。そこから、Thumbコントロールを探して、必要なイベントをリッスンできます。

このようなものが機能するはずです:

public class SliderValueChangeCompletedEventArgs : RoutedEventArgs
{
    private readonly double _value;

    public double Value { get { return _value; } }

    public SliderValueChangeCompletedEventArgs(double value)
    {
        _value = value;
    }
}
public delegate void SlideValueChangeCompletedEventHandler(object sender, SliderValueChangeCompletedEventArgs args);

public class ExtendedSlider : Slider
{
    public event SlideValueChangeCompletedEventHandler ValueChangeCompleted;
    private bool _dragging = false;

    protected void OnValueChangeCompleted(double value)
    {
        if (ValueChangeCompleted != null)
        {
            ValueChangeCompleted(this, new SliderValueChangeCompletedEventArgs(value) );
        }
    }

    protected override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        var thumb = base.GetTemplateChild("HorizontalThumb") as Thumb;
        if (thumb != null)
        {
            thumb.DragStarted += ThumbOnDragStarted;
            thumb.DragCompleted += ThumbOnDragCompleted;
        }
        thumb = base.GetTemplateChild("VerticalThumb") as Thumb;
        if (thumb != null)
        {
            thumb.DragStarted += ThumbOnDragStarted;
            thumb.DragCompleted += ThumbOnDragCompleted;
        }
    }

    private void ThumbOnDragCompleted(object sender, DragCompletedEventArgs e)
    {
        _dragging = false;
        OnValueChangeCompleted(this.Value);
    }

    private void ThumbOnDragStarted(object sender, DragStartedEventArgs e)
    {
        _dragging = true;
    }

    protected override void OnValueChanged(double oldValue, double newValue)
    {
        base.OnValueChanged(oldValue, newValue);
        if (!_dragging)
        {
            OnValueChangeCompleted(newValue);
        }
    }
}
于 2014-11-06T17:01:17.840 に答える
2

ブール値のペアisValueChangedと(可能であればポインターを操作せずに値を変更する)isPressedを使用できます。

private void Slider_ValueChanged(object s, RangeBaseValueChangedEventArgs e) {
    if (!isPressed) {
        AcceptChanges();
    } else {
        isValueChanged = true;
    }
}

初期化コード:

Window.Current.CoreWindow.PointerPressed += (e, a) => { isPressed = true; };

Window.Current.CoreWindow.PointerReleased += (e, a) => {
    isPressed = false;
    if (isValueChanged) AcceptChanges();
};
于 2013-08-13T09:02:43.240 に答える
1

SliderWindows8/WinRTでを使用して同様の問題が発生しました。

私の問題は次のとおりでした。ValueChangedイベントに反応し、各トリガーの後に長時間続く操作(ファイルへの非同期書き込み)を実行していました。したがって、同時編集の例外が発生します。これを避けるために、私はを使用しましたDispatcherTimer

    //Class member
    private DispatcherTimer myDispatcherTimer = null;

    private void OnSliderValueChanged(object sender, RangeBaseValueChangedEventArgs e)
    {
        //I update my UI right away
        ...

        //If the dispatcher is already created, stop it
        if (myDispatcherTimer!= null)
            myDispatcherTimer.Stop();

        //Overwrite the DispatcherTimer and thus reset the countdown
        myDispatcherTimer= new DispatcherTimer();
        myDispatcherTimer.Tick += (sender, o) => DoSomethingAsync();
        myDispatcherTimer.Interval = new TimeSpan(0,0,2);
        myDispatcherTimer.Start();
    }

    private async void DoSomethingAsync()
    {
        await DoThatLongSaveOperation();
    }

最終的な値を直接検出することはできませんが、少なくとも2つの更新の間に長い一時停止が発生するまで操作を遅らせることができます(たとえば、私の場合、ユーザーがスライダーをドラッグして、ドラッグを2秒間維持しながら停止した場合、とにかく保存操作が実行されます)。

于 2013-03-12T10:37:12.047 に答える