Sie können verwenden Cursor.Current
.
// Set cursor as hourglass
Cursor.Current = Cursors.WaitCursor;
// Execute your time-intensive hashing code here...
// Set cursor as default arrow
Cursor.Current = Cursors.Default;
Wenn der Hashing-Vorgang jedoch sehr langwierig ist (MSDN definiert dies als mehr als 2-7 Sekunden), sollten Sie wahrscheinlich eine andere visuelle Rückmeldungsanzeige als den Cursor verwenden, um den Benutzer über den Fortschritt zu informieren. Ausführlichere Richtlinien finden Sie in diesem Artikel .
Bearbeiten:
Wie @Am hervorhob, müssen Sie möglicherweise Application.DoEvents();
nachher anrufen, Cursor.Current = Cursors.WaitCursor;
um sicherzustellen, dass die Sanduhr tatsächlich angezeigt wird.
Application.UseWaitCursor = true
undApplication.UseWaitCursor = false
Tatsächlich,
Setzt den Wartecursor vorübergehend, stellt jedoch nicht sicher, dass der Wartecursor bis zum Ende Ihres Vorgangs angezeigt wird. Andere Programme oder Steuerelemente in Ihrem Programm können den Cursor leicht auf den Standardpfeil zurücksetzen, wie dies tatsächlich der Fall ist, wenn Sie die Maus bewegen, während der Vorgang noch ausgeführt wird.
Eine viel bessere Möglichkeit, den Wait-Cursor anzuzeigen, besteht darin, die UseWaitCursor-Eigenschaft in einem Formular auf true zu setzen:
Dadurch wird der Wartecursor für alle Steuerelemente im Formular angezeigt, bis Sie diese Eigenschaft auf false setzen. Wenn der Wartecursor auf Anwendungsebene angezeigt werden soll, sollten Sie Folgendes verwenden:
quelle
Aufbauend auf dem vorherigen Ansatz besteht mein bevorzugter Ansatz (da dies eine häufig ausgeführte Aktion ist) darin, den Wartecursorcode in eine IDisposable-Hilfsklasse zu verpacken, damit er mit using () (einer Codezeile) verwendet werden kann, optionale Parameter zu übernehmen und auszuführen den Code darin, dann bereinigen (Cursor wiederherstellen).
Verwendungszweck:
quelle
Es ist einfacher, UseWaitCursor auf Formular- oder Fensterebene zu verwenden. Ein typischer Anwendungsfall kann wie folgt aussehen:
Für eine bessere Benutzeroberfläche sollten Sie Asynchrony aus einem anderen Thread verwenden.
quelle
Mein Ansatz wäre es, alle Berechnungen in einem Hintergrundarbeiter durchzuführen.
Ändern Sie dann den Cursor wie folgt:
Und im Finish-Ereignis des Threads stellen Sie den Cursor wieder her:
Beachten Sie, dass dies auch für bestimmte Steuerelemente möglich ist, sodass der Cursor nur dann die Sanduhr ist, wenn sich die Maus darüber befindet.
quelle
OK, also habe ich eine statische asynchrone Methode erstellt. Dadurch wurde das Steuerelement deaktiviert, das die Aktion startet und den Anwendungscursor ändert. Es führt die Aktion als Aufgabe aus und wartet auf den Abschluss. Die Steuerung kehrt zum Anrufer zurück, während dieser wartet. Die Anwendung reagiert also auch dann, wenn sich das Besetztzeichen dreht.
Hier ist der Code aus dem Hauptformular
Ich musste einen separaten Logger für die Dummy-Aktion verwenden (ich verwende Nlog) und mein Hauptlogger schreibt in die Benutzeroberfläche (ein Rich-Text-Feld). Ich konnte die Besetzt-Cursor-Show nur dann nicht abrufen, wenn sie sich über einem bestimmten Container im Formular befand (aber ich habe mich nicht sehr bemüht). Alle Steuerelemente haben eine UseWaitCursor-Eigenschaft, aber sie scheinen keine Auswirkungen auf die Steuerelemente zu haben Ich habe es versucht (vielleicht weil sie nicht oben waren?)
Hier ist das Hauptprotokoll, das die Ereignisse in der von uns erwarteten Reihenfolge zeigt:
quelle
Mit der folgenden Klasse können Sie den Vorschlag von Donut "ausnahmesicher" machen.
die Klasse CursorHandler
quelle
Okey, die Sichtweise anderer Leute ist sehr klar, aber ich möchte einige hinzufügen, wie folgt:
quelle
Für Windows Forms-Anwendungen kann eine optionale Deaktivierung eines UI-Steuerelements sehr nützlich sein. Mein Vorschlag sieht also so aus:
Verwendungszweck:
quelle
Verwenden Sie dies mit WPF:
quelle