Tipps und Tricks rund um .NET und Visual Studio

Wartecursor in WPF-Fenstern anzeigen
Keine Kommentare

Dr. Holger Schwichtenberg (MVP) teilt in der Kolumne „.NETversum“ sein Expertenwissen rund um .NET-Tools und WPF mit. In dieser Ausgabe geht es um das Anzeigen des Wartecursers in WPF-Fenstern.

Windows kennt verschiedene Cursortypen: verschiedene Grafiken, die als Windows-Cursor angezeigt werden, abhängig von der aktuellen Situation. Ein Wartecursor zeigt an, dass der Benutzer aktuell auf das Beenden einer Aktion warten muss und eigentlich keine anderen Aktionen ausführen soll. Dennoch kann der Benutzer auch noch beim Wartecursor mit dem Cursor die Oberfläche bedienen. Microsoft bezeichnet den Wartecursor auch aus historischen Gründen noch als „Hourglass“ (Sanduhr), auch wenn er in neueren Windows-Versionen nicht mehr als Sanduhr grafisch dargestellt wird (Abb. 1 und 2).

Abb. 1: Der normale Cursor (hier in Windows 10)

Abb. 1: Der normale Cursor (hier in Windows 10)

Abb. 2: Der Wartecursor (ebenfalls Windows 10)

Abb. 2: Der Wartecursor (ebenfalls Windows 10)

In einem WPF-Fenster setzt man den Cursor für das Fenster ganz einfach über:

this.Cursor = System.Windows.Input.Cursors.Wait;

Die Enumeration System.Windows.Input.Cursors bietet den Zugriff auf eine Reihe von Standardcursorgrafiken.

Die Änderung der Cursordarstellung und die Rückänderung auf die vorherige Cursordarstellung kann man elegant in eine Hilfsroutine kapseln. ShowWaitCursorWhile() zeigt den Wartecursor, solange die als Parameter übergebene Methode TueEtwas() läuft:

CancellationTokenSource cts;
CancellationToken token;

private void C_AktionStarten_Click
  (object sender, RoutedEventArgs e)
{
  cts = new CancellationTokenSource();
  ct = cts.Token;
  WPFTasks.ShowWaitCursorWhile(this, TueEtwas, 10, ct);
}

Die Implementierung von ShowWaitCursorWhile() verwendet die Task Parallel Library (TPL), um die Aufgabe im Hintergrund in einem eigenen Thread auszuführen (Listing 1).

/// <summary>
/// Shows the wait cursor while action happens in Background.
/// </summary>
/// <param name="win">The win.</param>
/// <param name="action">The action.</param>
/// <param name="token">The optional CancellationToken.</param>
/// <returns></returns>
public static Task ShowWaitCursorWhile(Window win, Action<object> action, object parameter, CancellationToken token = new CancellationToken())
{
  Cursor previousCursor = win.Cursor;
  win.Cursor = Cursors.Wait;

  return Task.Factory.StartNew(() =>
  {
    action(parameter);
  }).ContinueWith((t) =>
  {
    win.Dispatcher.BeginInvoke(new Action(() => win.Cursor = previousCursor));
  });
}

Dabei gibt es auch die Möglichkeit, die Aktion vorzeitig mit einem CancelationToken zu beenden. Die Implementierung von TueEtwas() zeigt Listing 2.

public void TueEtwas(int obergrenzeDefault)
{

 int obergrenze = obergrenzeDefault;


  this.Dispatcher.Invoke(new Action(() =>
  {
    Int32.TryParse(this.C_Eingabe.Text, out obergrenze);
  }));

  for (int i = 0; i <= 100; i++)
  {
    if (ct.IsCancellationRequested) return;
    System.Diagnostics.Debug.WriteLine(i);
      this.Dispatcher.Invoke(new Action(() =>
    {
      this.C_Ausgabe.Text = i.ToString();
      this.C_Fortschritt.Value = i;
    }));

    System.Threading.Thread.Sleep(100);
  }
}

Auslöser für den Abbruch ist dann der Aufruf von Cancel():

private void C_Abbruch_Click(object sender, RoutedEventArgs e)
{
  cts.Cancel();
}

Buchempfehlungdotnet_praxis

In den vergangenen Jahren haben Dr. Holger Schwichtenberg und Manfred Steyer im „Windows Developer“ regelmäßig Tipps und Tricks aus ihrem Alltag als Softwareentwickler, Berater und Trainer für .NET- und webbasierte Anwendungen veröffentlicht. Das vorliegende Buch ist eine aktualisierte und deutlich erweiterte Zusammenfassung dieser Tipps und Tricks. Es umfasst sowohl das .NET Framework und seine zahlreichen Teilbibliotheken als auch die beliebte JavaScript-Bibliothek AngularJS sowie die Entwicklungsumgebung Visual Studio und ergänzende Werkzeuge.

Mehr Infos: www.entwickler-press.de/Dotnet-Praxis

Unsere Redaktion empfiehlt:

Relevante Beiträge

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu:
X
- Gib Deinen Standort ein -
- or -