Für eine mit WPF erstellte Ansicht möchte ich den Mauszeiger in eine Sanduhr ändern, wenn die Anwendung beschäftigt ist und nicht reagiert.
Eine Lösung ist das Hinzufügen
this.Cursor = Cursors.Wait;
an alle Stellen, an denen die Benutzeroberfläche möglicherweise nicht mehr reagiert. Aber offensichtlich ist dies nicht die beste Lösung. Ich frage mich, wie ich das am besten erreichen kann.
Ist es möglich, dies mithilfe von Stilen oder Ressourcen zu erreichen?
Vielen Dank,
using(uiServices.ShowWaitCursor())
. Sieht umständlich aus, erleichtert aber das Testen von Einheiten.Ich habe die Antworten hier verwendet, um etwas zu bauen, das für mich besser funktioniert. Das Problem ist, dass die Benutzeroberfläche nach Abschluss des Verwendungsblocks in Carlos Antwort möglicherweise immer noch mit der Datenbindung beschäftigt ist. Aufgrund der Vorgänge im Block werden möglicherweise faul geladene Daten oder Ereignisse ausgelöst. In meinem Fall dauerte es manchmal einige Sekunden, bis der Waitcursor verschwunden war, bis die Benutzeroberfläche tatsächlich bereit war. Ich habe es gelöst, indem ich eine Hilfsmethode erstellt habe, die den Wartecursor setzt und sich auch um die Einrichtung eines Timers kümmert, der den Cursor automatisch zurücksetzt, wenn die Benutzeroberfläche bereit ist. Ich kann nicht sicher sein, ob dieses Design in allen Fällen funktioniert, aber es hat bei mir funktioniert:
quelle
Ich mache es einfach
Gemäß der Dokumentation der Mouse.OverrideCursor-Eigenschaft
Die try-finally-Anweisung stellt sicher, dass der Standardcursor in jedem Fall wiederhergestellt wird, auch wenn eine Ausnahme auftritt oder der try-Teil mit
return
oderbreak
verbleibt (wenn er sich in einer Schleife befindet).quelle
Der beste Weg wäre, die Benutzeroberfläche nicht mehr ansprechbar zu machen und die gesamte Arbeit gegebenenfalls auf andere Threads / Aufgaben zu verlagern.
Abgesehen davon befinden Sie sich in einer Art Catch-22: Wenn Sie eine Möglichkeit hinzugefügt haben, um festzustellen, dass die Benutzeroberfläche nicht reagiert, gibt es keine gute Möglichkeit, den Cursor zu ändern, da dies der Ort ist, an dem Sie dies tun müssten ( Der gerade Thread) reagiert nicht ... Sie können möglicherweise den Standard-Win32-Code verwenden, um den Cursor für das gesamte Fenster zu ändern.
Andernfalls müssten Sie dies vorbeugend tun, wie Ihre Frage nahelegt.
quelle
Ich persönlich ziehe es vor, nicht zu sehen, wie der Mauszeiger viele Male von Sanduhr zu Pfeil wechselt. Um dieses Verhalten beim Aufrufen eingebetteter Funktionen zu verhindern, die eine Weile dauern, und bei jedem Versuch, den Mauszeiger zu steuern, verwende ich einen Stapel (Zähler), den ich als LifeTrackerStack bezeichne. Und nur wenn der Stapel leer ist (gegen 0), setze ich die Sanduhr auf einen Pfeil zurück.
Ich benutze auch MVVM. Ich bevorzuge auch thread-sicheren Code.
In meiner Stammklasse des Modells deklariere ich meinen LifeTrackerStack, den ich entweder in untergeordneten Modellklassen auffülle oder direkt aus untergeordneten Modellklassen verwende, wenn ich von diesen aus darauf zugreifen kann.
Mein Lebensverfolger hat 2 Zustände / Aktionen:
Dann binde ich aus meiner Sicht manuell an mein Model.IsBusy und mache:
Dies ist meine Klasse LifeTrackerStack:
Und die Verwendung davon:
Überall, wo ich lange jogge, mache ich:
Für mich geht das. Hoffe es könnte jedem helfen! Eric
quelle
Seien Sie hier vorsichtig, da das Fummeln mit dem Wait Cursor einige Probleme mit STA-Threads verursachen kann. Stellen Sie sicher, dass Sie dieses Ding, wenn Sie es verwenden, in einem eigenen Thread ausführen. Ich habe hier ein Beispiel gepostet. In einer STA ausführen, die dies verwendet, um einen WaitCursor anzuzeigen, während die erzeugte Datei gestartet wird, und AFAICT (die Hauptanwendung) nicht in die Luft sprengt.
quelle
Das Ändern des Cursors bedeutet nicht, dass die Anwendung nach Abschluss der lang laufenden Aufgabe nicht auf Maus- und Tastaturereignisse reagiert. Um irreführende Benutzer zu vermeiden, verwende ich die folgende Klasse, die alle Tastatur- und Mausnachrichten aus der Anwendungsnachrichtenwarteschlange entfernt.
quelle
Ich habe die Lösung von Olivier Jacot-Descombes verwendet, sie ist sehr einfach und funktioniert gut. Vielen Dank. Update: Es funktioniert sogar gut, ohne einen anderen Thread / Hintergrund-Worker zu verwenden.
Ich benutze es mit backgroudworker, der Mauszeiger sieht gut aus, wenn er beschäftigt ist, und kehrt zum Normalzustand zurück, wenn die Arbeit erledigt ist.
quelle
Ich weiß, dass ich zu spät komme. Ich habe gerade die Art und Weise geändert, wie ich den Cursor Hourglass (Besetztzustand) meiner Anwendung verwalte.
Diese vorgeschlagene Lösung ist komplexer als meine erste Antwort, aber ich denke, sie ist vollständiger und besser.
Ich habe nicht gesagt, dass ich eine einfache oder vollständige Lösung habe. Aber für mich ist es das Beste, weil es meistens alle Probleme behebt, die ich beim Verwalten des Besetztzustands meiner Anwendung hatte.
Vorteile:
Der Code ist in wenige Klassen unterteilt:
Dies ist die Verwendung:
Drin:
Bevorzugte Verwendung:
Andere Verwendung:
Auto Window Cursor:
Code:
quelle