2017-06-21 4 views
0

So habe ich diese Bedingung, die ein GUI-Objekt auf eine Führungslinie Objekt einrastet. Ich möchte, dass das Objekt einrastet, aber wenn das System weiterhin eine Mausbewegung erkennt, möchte ich, dass das Objekt sich löst und weiter bewegt. Ich habe den Schnappzustand funktioniert, aber ich scheitere bei letzterem.C# Mit einem Timer, um einen booleschen Wert zu wechseln

Dies ist der Fall, dass ich schießen werde und es ständig zu

vom System gehört wird
private void UserControl_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (IsMouseCaptured && snappedVertically) //The IsMouseCaptured listens for mouse movement and snapped vertically is what I am using to snap the GUI element 
     { 
     if (snappedVertically) 
     { 
      Thread.Sleep(2000); //wait 2 seconds... 
      snappedVertically = false; //...then unsnap 
     } 
     } 
    } 

Das Problem ist, dass in der Anwendung gibt es Latenz, die dann nicht mehr reagiert, und ich habe eine Kraft Neustart zu tun . Kann mir jemand mit diesem Problem helfen?

+0

Ich bin nicht wirklich sicher, was Sie versuchen ... Warum setzen Sie 'Thread.Sleep (2000)'? Dies blockiert den UIhread. – gilmishal

Antwort

0

Das Schlummern des UI-Threads verursacht die Nichtansprechbarkeit.

Ihr Problem kann nur durch den Vergleich das Timing von Ereignissen gelöst werden:

DateTime _lastEventTime = DateTime.MinValue; 

private void UserControl_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (IsMouseCaptured && snappedVertically) //The IsMouseCaptured listens for mouse movement and snapped vertically is what I am using to snap the GUI element 
    { 
     if (snappedVertically) 
     { 
      if ((DateTime.Now - _lastEventTime) < TimeSpan.FromSeconds(2)) 
      { 
       snappedVertically = false; 
      } 
     } 
    } 

    _lastEventTime = DateTime.Now; 
} 

Ihre Frage auf dem gewünschte Verhalten nicht sehr klar, aber hier haben wir die letzte Ereigniszeit nach jedem Brennen aufzuzuzeichnen und Wenn wir dann vertikal geschnappt werden, prüfen Sie, ob das letzte Ereignis vor weniger als 2 Sekunden stattgefunden hat, wenn dies der Fall ist, dann wollen wir es auflösen.


aktualisieren

Wie pro Kommentar die Absicht der Frage zu klären, können Sie einen Wert nach 2 Sekunden als solche leicht wechseln:

private async void UserControl_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (IsMouseCaptured && snappedVertically) //The IsMouseCaptured listens for mouse movement and snapped vertically is what I am using to snap the GUI element 
    { 
     if (snappedVertically) 
     { 
      await Task.Delay(2000); 
      snappedVertically = false; 
     } 
    } 
} 

Nur vorsichtig sein, offensichtlich, weil, wenn gewartet diese 2 Sekunden, könnte der Benutzer die Maus wieder bewegen, die wiederum einen neuen Timer 2 Sekunden und so weiter und so weiter einstellen wird; Sie werden wahrscheinlich mehrere Verzögerungen vermeiden wollen, aber das ist eine Übung für Sie.

+0

was ich versuche zu erreichen, ist einen booleschen Wert nach x Anzahl der Sekunden zu wechseln. –

+0

danke und ja, ich bin im Moment Brainstorming eine Möglichkeit, mehrere Verzögerungen zu verhindern –

0

Vielleicht könnten Sie eine andere Methode, z. UIElement.IsMouseOver, um sicherzustellen, dass der Mauszeiger über einem bestimmten Objekt schwebt? Dann müssten Sie keinen Thread mehr schlafen.

Wie bereits erwähnt, ist Ihre Frage nicht klar über das Gesamtbild.

Verwandte Themen