In XAML habe ich die <Slider />
. Es hat das ValueChanged-Ereignis. Dieses Ereignis wird bei jeder Änderung von Value ausgelöst. Ich muss erkennen, wenn die Wertänderung vorbei ist. LostFocus, PointerReleased sind nicht das richtige Ereignis. Wie kann ich das erkennen?Wie kann ich erkennen, wenn der XAML-Slider abgeschlossen ist?
Antwort
Sie können eine neue Klasse erstellen und von Slider erben. Von dort aus können Sie nach dem Thumb-Steuerelement suchen & für die Ereignisse, die Sie möchten.
So etwas sollte funktionieren:
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);
}
}
}
Ich hatte ein ähnliches Problem mit einem Slider
auf Windows8/WinRT.
Mein Problem war das Folgende: Ich reagierte auf dasEreignis und führte eine lang andauernde Operation (Schreiben asynchron zu einer Datei) nach jedem Auslöser durch. Und damit in eine gleichzeitige Editier-Ausnahme geraten. Um dies zu vermeiden, habe ich eine DispatcherTimer
verwendet.
//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();
}
Sie können nicht direkt erkennen, was der Endwert ist, aber Sie können den Betrieb zumindest verzögern, bis es eine lange Pause zwischen zwei Updates (zB in meinem Fall, wenn der Benutzer den Schieber zieht und hält unter Beibehaltung Ziehen Sie für 2 Sekunden, der Speichervorgang wird trotzdem ausgelöst).
Ack! Ein Timer. 2 Sekunden? Warum nicht 1. 1 Sekunde, warum nicht 3? Ich denke, ich würde explizite Ereignisse bevorzugen. Was ist, wenn ihr System langsam ist? Was ist, wenn ihr System schnell ist? Du weißt was ich meine. –
Sie können Paar Bool-Werte isValueChanged verwenden und (wenn möglich, ändern Sie den Wert ohne Manipulation des Zeigers ) isPressed;
private void Slider_ValueChanged(object s, RangeBaseValueChangedEventArgs e) {
if (!isPressed) {
AcceptChanges();
} else {
isValueChanged = true;
}
}
Initialisierung Code:
Window.Current.CoreWindow.PointerPressed += (e, a) => { isPressed = true; };
Window.Current.CoreWindow.PointerReleased += (e, a) => {
isPressed = false;
if (isValueChanged) AcceptChanges();
};
Nicht sicher, dass dies die Tastatur unterstützt. –
XAML, WinRT, Windows8.1 und UWP:
PointerCaptureLost Ereignis sollte für Maus arbeiten/berühren
KeyUp Ereignis für Tastatur
- 1. Ajax erkennen, wenn von Senden abgeschlossen ist
- 2. Wenn SendAsync abgeschlossen ist?
- 3. MQTT: Erkennen, ob die Übermittlung abgeschlossen ist
- 4. LINUX: wie zu erkennen, dass FTP-Datei-Upload abgeschlossen ist
- 5. Wie überprüfen, wenn Javascript abgeschlossen ist
- 6. Wie führe ich eine Funktion aus, wenn XMLHttpRequest abgeschlossen ist?
- 7. Wie erkennt man, wenn innerHTML abgeschlossen ist
- 8. Wie kann ich die Schaltfläche vor dem Drucken ausblenden und anzeigen, wenn der Druckvorgang abgeschlossen ist?
- 9. Wie kann ich auto schließen in Firefox ausführen, wenn der Download abgeschlossen ist
- 10. Wie kann ich mein UIRefreshControl nur ausblenden, wenn das Abrufen der Daten abgeschlossen ist (in Swift)?
- 11. `sample` wird ausgelöst, wenn sie abgeschlossen ist. Wie vermeide ich?
- 12. So erkennen Sie, dass ein Marionettenlauf abgeschlossen ist
- 13. QNetworkAccessManager: Wie stelle ich sicher, dass der Download abgeschlossen ist?
- 14. Wie kann ich das letzte Objekt erkennen, wenn ich nachdenke?
- 15. Kann ich erkennen, wenn der Garbage Collector funktioniert?
- 16. Wie kann ich IE10 von JS erkennen, wenn der Browser IE9 ist?
- 17. Wie kann ich erkennen, wenn das Modulfenster in der Delphi-IDE geöffnet ist?
- 18. Benachrichtigen, wenn Ausführung/Befehl abgeschlossen ist
- 19. Wie überprüfe ich, ob der Snapshot jetzt 'abgeschlossen' ist?
- 20. UICollectionView - Erhalten Sie einen Rückruf, wenn der Ladevorgang abgeschlossen ist?
- 21. schließen firefox automatisch, wenn der Download abgeschlossen ist
- 22. Android-Exoplayer-Rückruf, wenn Suche abgeschlossen ist
- 23. Anruffunktion, wenn der Superjob eines Sidekiq-Superworker abgeschlossen ist
- 24. jQuery überprüfen, wenn der PDF-Download abgeschlossen ist
- 25. Wie kann ich erkennen, wenn die Maus das Fenster verlässt?
- 26. Wie kann ich erkennen, wenn ein iAd gelöscht wurde?
- 27. So erkennen Sie, wenn eine TableView-Anzeige oder Aktualisierung abgeschlossen ist (iOS)
- 28. Wie kann ich benachrichtigt werden, wenn eine dispatch_async-Aufgabe abgeschlossen ist?
- 29. Wie kann der Scanner beendet werden, wenn die Eingabe abgeschlossen ist?
- 30. Wie kann ich die Google+ Aufgabe "Freigabe abgeschlossen" in Javascript erkennen und Chrome Bookmarklet schließen?
Vielleicht ein Timer an ValueChanged angeschlossen? –
Es hört sich so an, als ob Sie damit zu kämpfen haben, wann genau Sie dieses Ereignis erhalten möchten. Ich denke, wenn Sie das herausfinden, werden Sie wahrscheinlich herausfinden, wie Sie es senden. Vielleicht würde ein Schieberegler mit diskreten Wertoptionen das deutlicher machen? – mydogisbox
Haben Sie dieses Problem jemals behoben? – Carlo