it-swarm.com.de

Wie zeige ich während des Startens einer WPF-Anwendung den Wartezeiger an?

Hier sind die grundlegenden Ereignisse, die ich beim Start meiner WPF-Anwendung ausführen möchte. Dies ist sehr ähnlich dem Start von Word auf meinem Computer.

  1. Zeigt den beschäftigten Cursor an.
  2. Grundinitialisierung durchführen Dies dauert einige Sekunden und muss ausgeführt werden, bevor der Begrüßungsbildschirm angezeigt wird.
  3. Begrüßungsbildschirm anzeigen. Dieser Begrüßungsbildschirm zeigt den Fortschritt bei der tiefer gehenden Initialisierung an und kann eine Weile dauern (speichert Informationen aus der Datenbank).
  4. Standardcursor anzeigen. Da der Begrüßungsbildschirm jetzt Fortschritt anzeigt, ist es nicht erforderlich, einen aktiven Cursor anzuzeigen.
  5. Sobald der Fortschritt des Begrüßungsbildschirms abgeschlossen ist, zeigen Sie das Hauptfenster an.
  6. Schließen Sie den Startbildschirm.

Alles funktioniert gut, außer der Anzeige des aktiven Cursors vor dem Startbildschirm. Wenn ich die Anwendung über eine Verknüpfung ausführe, blinkt der Wait-Cursor, geht aber bald auf den Standard zurück. Ich habe verschiedene Möglichkeiten zum Einstellen des Cursors ausprobiert, aber keine funktioniert, aber ich denke, das Problem ist, dass ich nicht in einem Steuerelement/Fenster bin. Bei den von mir eingestellten Eigenschaften handelt es sich anscheinend um Windows Forms-Eigenschaften. Hier ist ein Auszug aus meinem Code in App.xaml.cs. 

protected override void OnStartup(StartupEventArgs e)
{
  base.OnStartup(e);

  System.Windows.Forms.Application.UseWaitCursor = true;
  //System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor;
  //System.Windows.Forms.Application.DoEvents();

  Initialize();

  SplashWindow splash = new SplashWindow();
  splash.Show();

  System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default;

  // Right now I'm showing main window right after splash screen but I will eventually wait until splash screen closes.
  MainWindow main = new MainWindow();
  main.Show();
}
17
bsh152s

Das sollte funktionieren

Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;

Verwenden Sie System.Windows.Input nicht System.Windows.Forms.

42
Kevin DiTraglia

Wenn Sie eine Aufgabe haben, die viel Zeit in Anspruch nimmt, und die auf einem Nicht-GUI-Thread ausgeführt wird (was eine gute Idee ist), können Sie diesen Code zum Ändern des Anwendungscursors verwenden:

Application.Current.Dispatcher.Invoke(() =>
{
    Mouse.OverrideCursor = Cursors.Wait;
});

Wenn der Beschäftigungsprozess abgeschlossen ist, verwenden Sie Folgendes:

Application.Current.Dispatcher.Invoke(() =>
{
    Mouse.OverrideCursor = null;
});
22
user2069105

Ich gehe davon aus, dass die Initialisierung () der Teil ist, für den Ihr beschäftigter Cursor erscheinen soll, ja?

Wenn ja, versuchen Sie folgendes:

  1. Legen Sie in Ihrem MainWindow.xaml im Element <Window> die folgenden Eigenschaften fest: Visibility="Hidden" und Cursor="Wait".
  2. Verschieben Sie in Ihrer MainWindow.xaml.cs den Initialisierungscode aus dem Konstruktor in eine öffentliche Initialize () - Methode, damit Code, der vom Aufruf Initialize () abhängt, nicht ausgeführt wird. Stellen Sie sicher, dass am Ende der Initialize () - Methode die Visiblity-Eigenschaft auf Visible gesetzt wird und auch die Cursor zurückgesetzt wird.
  3. Aktualisieren Sie den oben abgebildeten Code-Snippet wie folgt:
protected override void OnStartup(StartupEventArgs e)
{
  base.OnStartup(e);

  MainWindow main = new MainWindow();
  main.Show(); // this should set the cursor how you want it
  Initialize();
  SplashWindow splash = new SplashWindow();
  splash.Show();
  main.Initialize(); // now invoke the Initialize method you created
  // Right now I'm showing main window right after splash screen but I will eventually wait until splash screen closes.
}
2
Nathan Strong
        Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
        InitializeComponent();
        ...
        Mouse.OverrideCursor = null;
0
Bianca Kalman