2012-12-13 41 views
6

एक्सएएमएल में मेरे पास <Slider /> है। इसमें ValueChanged घटना है। यह घटना मूल्य में हर बदलाव के साथ आग लगती है। जब मूल्य परिवर्तन खत्म हो गया है तो मुझे पता लगाना चाहिए। लॉस्टफोकस, पॉइंटर रिलीज सही घटना नहीं है। मैं इसका कैसे पता लगा सकता हूं?एक्सएएमएल स्लाइडर पूरा होने पर मैं कैसे पता लगा सकता हूं?

+0

शायद ValueChanged से जुड़ा एक टाइमर? –

+0

ऐसा लगता है कि आप किस घटना के साथ संघर्ष कर रहे हैं यह परिभाषित कर रहा है कि वास्तव में आप इस घटना को कब प्राप्त करना चाहते हैं। मुझे लगता है कि अगर आप इसे समझते हैं तो आप शायद यह पता लगाएंगे कि इसे कैसे भेजा जाए। शायद असतत मूल्य विकल्पों वाला एक स्लाइडर इसे और स्पष्ट कर देगा? – mydogisbox

+0

क्या आपने कभी इस समस्या को ठीक किया है? – Carlo

उत्तर

7

आप एक नया वर्ग बना सकते हैं और स्लाइडर से विरासत कर सकते हैं। वहां से, आप थंब नियंत्रण & देख सकते हैं कि आप जो ईवेंट चाहते हैं उसे सुनें।

इस तरह काम करना चाहिए:

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 पर Slider का उपयोग करके एक समान समस्या थी।

मेरी समस्या निम्न थी: मैं 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 सेकंड के लिए खींचें, बचाओ ऑपरेशन वैसे भी निकाल दिया जाएगा)।

+0

एएके! एक टाइमर 2 सेकेंड? क्यों नहीं 1. 1 सेकंड, क्यों नहीं 3? मुझे लगता है कि मैं स्पष्ट घटनाओं को पसंद करूंगा। क्या होगा यदि उनकी प्रणाली धीमी है? क्या होगा यदि उनकी प्रणाली तेज है? आप जानते हैं कि मेरा क्या मतलब है। –

1

आप बूल मानों की जोड़ी का उपयोग कर सकते हैं ValueChanged और (यदि संभव है तो सूचक के हेरफेर के बिना संभव परिवर्तन मूल्य) दबाया गया है;

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

सुनिश्चित नहीं है कि यह कीबोर्ड का समर्थन करेगा। –

8

XAML, WinRT, windows8.1 और UWP:

PointerCaptureLost घटना/माउस के लिए काम करना चाहिए के लिए स्पर्श
KeyUp घटना कीबोर्ड