In XAML ho il <Slider />
. Ha l'evento ValueChanged. Questo evento si attiva con ogni modifica al valore. Devo rilevare quando il cambio di valore è finito. LostFocus, PointerReleased non è l'evento corretto. Come posso rilevare questo?Come posso rilevare quando il cursore XAML è stato completato?
risposta
È possibile creare una nuova classe ed ereditare da Slider. Da lì in poi, puoi cercare il Thumb control & per ascoltare gli eventi che desideri.
Qualcosa del genere dovrebbe funzionare:
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);
}
}
}
Ho avuto un problema simile utilizzando uno Slider
su Windows8/WinRT.
Il mio problema era il seguente: stavo reagendo all'evento ValueChanged
ed eseguivo un'operazione di lunga durata (scrivendo in modo asincrono su un file) dopo ogni trigger. E quindi incorrere in un'eccezione di modifica simultanea. Per evitare questo, ho usato uno 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();
}
Non è possibile rilevare direttamente ciò che il valore finale è, ma si può almeno ritardare l'operazione fino a quando c'è una lunga pausa tra due aggiornamenti (ad esempio, nel mio caso, se l'utente trascina il cursore e si ferma, pur mantenendo il trascinamento per 2 secondi, l'operazione di salvataggio verrà comunque attivata).
Ack! Un timer 2 secondi? Perché non 1. 1 secondo, perché non 3? Penso che preferirei eventi espliciti. Cosa succede se il loro sistema è lento? Cosa succede se il loro sistema è veloce? Sai cosa intendo. –
È possibile utilizzare una coppia di valori boolèValueChanged e (se possibile modificare il valore senza la manipolazione del puntatore ) isPressed;
private void Slider_ValueChanged(object s, RangeBaseValueChangedEventArgs e) {
if (!isPressed) {
AcceptChanges();
} else {
isValueChanged = true;
}
}
codice di inizializzazione:
Window.Current.CoreWindow.PointerPressed += (e, a) => { isPressed = true; };
Window.Current.CoreWindow.PointerReleased += (e, a) => {
isPressed = false;
if (isValueChanged) AcceptChanges();
};
Non sicuro che questo supporterà la tastiera. –
XAML, WinRT, Windows8.1 e UWP:
PointerCaptureLost evento dovrebbe funzionare per il mouse/tocco
KeyUp evento per tastiera
- 1. Come posso rilevare quando il download di un file è stato completato in ASP.NET?
- 2. UICollectionView: come rilevare quando lo scorrimento è stato interrotto
- 3. Come rilevare quando Mousemove è stato interrotto
- 4. Come rilevare il binding dei dati completato in WPF
- 5. Come posso rilevare che il tasto Shift è stato premuto?
- 6. writeToFile come dire quando è completato
- 7. Come rendere sfumato il video HTML5 quando è stato completato il caricamento?
- 8. rilevare quando il riempimento automatico è stato riempito
- 9. Come posso nascondere il pulsante prima della stampa e mostrarlo quando il processo di stampa è stato completato?
- 10. Rilevare quando il contenuto Iframe è stato caricato (Cross browser)
- 11. quando eseguo manualmente il garbage collector, come posso sapere quando è completato?
- 12. Come posso rilevare quando il cursore si trasforma in I-beam in AS3?
- 13. Il reindirizzamento prima del caricamento POST è stato completato
- 14. Come posso rilevare se un iframe è stato caricato?
- 15. rilevare quando ValueAnimator è fatto
- 16. Come posso rilevare quando un nuovo elemento è stato aggiunto al documento in jQuery?
- 17. Come posso rilevare se un Chrome Extension è stato abilitato (dopo essere stato disabilitato)
- 18. controllare se il download è completato
- 19. Come posso rilevare quando la mia vista è stata spostata?
- 20. come scoprire se il layout della forza è stato completato ponendo i nodi?
- 21. Posso rilevare che un metodo è stato sovrascritto?
- 22. Mostra il cursore all'interno di EditText quando lo stato attivo non è attivo EditText
- 23. callback per funzionare dopo che .each() è stato completato?
- 24. Come rilevare quando innerHTML è completo
- 25. Jenkins - Ottieni l'ultimo stato di costruzione completato
- 26. Come posso posizionare il cursore sul cursore di attesa?
- 27. Come posso rilevare una barra di stato a doppia altezza?
- 28. Come posso forzare il selenio a eseguire i test solo dopo che $ (document) .ready() è stato completato?
- 29. come rilevare quando MotionEvent.ACTION_MOVE è terminato
- 30. Come rilevare quando l'animazione UINavigationController è terminata?
Forse un timer collegato a ValueChanged? –
Sembra che quello con cui stai lottando stia definendo esattamente quando vuoi ricevere questo evento. Penso che se lo capisci allora probabilmente capirai come inviarlo. Forse uno slider con opzioni di valore discreto renderebbe questo più chiaro? – mydogisbox
Hai mai risolto questo problema? – Carlo