Wie kann ich dem Benutzer den Wait / Busy Cursor (normalerweise der Sanduhr) anzeigen, um ihm mitzuteilen, dass das Programm etwas ausführt?
Antworten
Zu viele Anzeigen?Sie können Cursor.Current
verwenden.
// Setzen Sie den Cursor als Sanduhr
Cursor.Current = Cursors.WaitCursor;
// Führen Sie Ihren zeitaufwändigen Hashing-Code hier aus...
// Setzen Sie den Cursor als Standardpfeil
Cursor.Current = Cursors.Default;
Wenn der Hashing-Vorgang jedoch wirklich langwierig ist (MSDN definiert dies als mehr als 2-7 Sekunden), sollten Sie wahrscheinlich einen visuellen Feedback-Indikator verwenden, um den Benutzer über den Fortschritt zu informieren, anstelle des Cursors. Für eine ausführlichere Reihe von Richtlinien siehe diesen Artikel.
Bearbeiten:
Wie @Am angemerkt hat, müssen Sie möglicherweise Application.DoEvents();
aufrufen nach Cursor.Current = Cursors.WaitCursor;
, um sicherzustellen, dass die Sanduhr tatsächlich angezeigt wird.
Eigentlich,
Cursor.Current = Cursors.WaitCursor;
temporär setzt den Wait-Cursor, garantiert aber nicht, dass der Wait-Cursor bis zum Ende Ihrer Operation angezeigt wird. Andere Programme oder Steuerelemente innerhalb Ihres Programms können den Cursor leicht zurück auf den Standard-Pfeil setzen, wie es tatsächlich passiert, wenn Sie die Maus bewegen, während die Operation noch läuft.
Ein viel besseres Vorgehen, um den Wait-Cursor anzuzeigen, ist die Verwendung der UseWaitCursor-Eigenschaft in einem Formular auf true zu setzen:
form.UseWaitCursor = true;
Dies zeigt den Wait-Cursor für alle Steuerelemente im Formular, bis Sie diese Eigenschaft auf false setzen. Wenn Sie möchten, dass der Wait-Cursor auf Anwendungsebene angezeigt wird, sollten Sie folgendes verwenden:
Application.UseWaitCursor = true;
Building on the previous, my preferred approach (since this is a frequently performed action) is to wrap the wait cursor code in an IDisposable helper class so it can be used with using() (one line of code), take optional parameters, run the code within, then clean up (restore cursor) afterwards.
public class CursorWait : IDisposable
{
public CursorWait(bool appStarting = false, bool applicationCursor = false)
{
// Warten
Cursor.Current = appStarting ? Cursors.AppStarting : Cursors.WaitCursor;
if (applicationCursor) Application.UseWaitCursor = true;
}
public void Dispose()
{
// Zurücksetzen
Cursor.Current = Cursors.Default;
Application.UseWaitCursor = false;
}
}
Verwendung:
using (new CursorWait())
{
// Führen Sie einige Codes aus, die den Cursor anzeigen
}
Es ist einfacher, UseWaitCursor auf Form- oder Fensterebene zu verwenden. Ein typischer Anwendungsfall kann wie folgt aussehen:
private void button1_Click(object sender, EventArgs e)
{
try
{
this.Enabled = false; // optional, besser ein Panel oder spezifische Steuerelemente anvisieren
this.UseWaitCursor = true;//vom Form/Fenster-Exemplar
Application.DoEvents();// Nachrichten werden gepumpt, um Steuerelemente zu aktualisieren
//führen Sie hier eine langwierige blockierende Operation aus,
//bla bla ....
}
finally
{
this.Enabled = true; // optional
this.UseWaitCursor = false;
}
}
Für eine bessere Benutzeroberfläche sollten Sie Asynchronität aus einem anderen Thread verwenden.
Mein Ansatz wäre, alle Berechnungen in einem Hintergrundarbeiter zu machen.
Ändern Sie dann den Cursor wie folgt:
this.Cursor = Cursors.Wait;
Und im Finish-Event des Threads den Cursor wiederherstellen:
this.Cursor = Cursors.Default;
Anmerkung: Dies kann auch für spezifische Steuerelemente erfolgen, sodass der Cursor nur dann der Sanduhr entspricht, wenn sich der Mauszeiger über ihnen befindet.
- See previous answers
- Weitere Antworten anzeigen