2012-12-13 5 views
6

Ben <Slider /> var. ValueChanged olayına sahip. Bu olay, Değer'e yapılan her değişiklikle tetiklenir. Değer değişikliğinin ne zaman sona erdiğini tespit etmem gerekiyor. LostFocus, PointerReleased doğru olay değil. Bunu nasıl tespit edebilirim?XAML Kaydırıcısı Tamamlandığında Nasıl Algılayabilirim? XAML içinde

+0

Belki bir zamanlayıcı ValueChanged'e bağlı? –

+0

Size tam olarak bu olayı almak istediğinizde tanımlıyor ile mücadele şeye benziyor. Bunu anlarsanız, muhtemelen nasıl gönderileceğini öğreneceksiniz. Belki ayrık değer seçeneklerine sahip bir kaydırıcı bunu daha net yapar mı? – mydogisbox

+0

Bu sorunu daha önce düzelttiniz mi? – Carlo

cevap

7

Sen yeni bir sınıf oluşturmak ve Kaydırıcısının dan devralabilir. Orada andan itibaren, & istediğiniz olayları dinlemek Başparmak kontrolü için bakabilirsiniz.

Böyle bir şey çalışması gerekir:

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); 
     } 
    } 
} 
1

Windows8/WinRT'de Slider kullanarak benzer bir sorun yaşadım.

Sorunum şunlardı: ValueChanged Olayına tepki veriyor ve her tetiklemeden sonra (kalıcı olarak bir dosyaya yazma) uzun süreli bir işlem gerçekleştiriyordum. Böylece eşzamanlı bir düzenleme istisnasına dönüşüyor. Bunu önlemek için DispatcherTimer kullandım. kullanıcı sürgüsünü sürükler ve eğer korurken

//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(); 
    } 

doğrudan nihai değerinin ne algılayamaz, ancak iki güncellemeler arasında uzun bir duraklama kalmayıncaya kadar en az çalışmasını geciktirebilir (örneğin benim durumumda, durur 2 saniye boyunca sürükle, kaydetme işlemi yine de tetiklenir).

+0

Ack! Bir zamanlayıcı. 2 saniye? Neden olmasın 1. 1 saniye, neden 3 değil? Ben açık olayları tercih ederim. Ya sistemi yavaşsa? Ya sistemi hızlıysa? Ne demek istediğimi biliyorsun. –

1

Çift bool değerlerini kullanabilirsiniz. Değer Değiştirildi ve (eğer mümkünse işaretçisini kullanmadan değeri değiştirin);

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

Başlatma kodu:

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

Window.Current.CoreWindow.PointerReleased += (e, a) => { 
    isPressed = false; 
    if (isValueChanged) AcceptChanges(); 
}; 
+0

Bunun, klavyeyi destekleyeceğinden emin değil. –

8

XAML, WinRT, Windows8.1 ve UWP:

PointerCaptureLost olay/fare için çalışmak için
KeyUp etkinliğe dokunun gerekir klavye