web-dev-qa-db-fra.com

Comment afficher le curseur d'attente lors du démarrage d'une application WPF?

Voici les événements de base que je souhaite voir se produire au démarrage de mon application WPF. Cela ressemble beaucoup à la façon dont Word démarre sur ma machine.

  1. Afficher le curseur occupé.
  2. Effectuer une initialisation de base. Cela prend quelques secondes et doit être fait avant que l'écran de démarrage ne s'affiche.
  3. Afficher l'écran de démarrage. Cet écran de démarrage affiche la progression vers une initialisation plus approfondie et peut prendre un certain temps (informations de cache de la base de données).
  4. Afficher le curseur par défaut. Étant donné que l'écran de démarrage affiche la progression, il n'est pas nécessaire d'afficher un curseur occupé.
  5. Une fois la progression de l'écran de démarrage terminée, affichez la fenêtre principale.
  6. Fermez l'écran de démarrage.

Tout fonctionne bien sauf l'affichage du curseur occupé avant l'affichage de l'écran de démarrage. Lorsque j'exécute l'application via un raccourci, le curseur d'attente clignote, mais revient rapidement à la valeur par défaut. J'ai essayé différentes manières de définir le curseur, mais aucune ne fonctionne, mais je pense que le problème est que je ne suis pas dans un contrôle/une fenêtre - je le fais depuis App.xaml.cs. De plus, les propriétés que je configure semblent être des propriétés de Windows Forms. Voici un extrait de mon code dans 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

Cela devrait marcher

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

Utilisez System.Windows.Input pas System.Windows.Forms.

42
Kevin DiTraglia

Si vous avez une tâche qui prend beaucoup de temps et qu'elle s'exécute sur un thread non graphique (ce qui est une bonne idée), vous pouvez utiliser ce code pour modifier le curseur de l'application:

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

Lorsque le processus occupé est terminé, utilisez ceci:

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

Je suppose que Initialize () est la partie pour laquelle vous voulez que votre curseur occupé apparaisse, oui?

Si c'est le cas, essayez l'approche suivante:

  1. Dans votre MainWindow.xaml, sur l'élément <Window>, définissez les propriétés suivantes: Visibility="Hidden" et Cursor="Wait".
  2. Dans votre MainWindow.xaml.cs, déplacez le code d'initialisation hors du constructeur et dans une méthode publique Initialize (), de sorte que tout code dépendant de l'appel Initialize () ne soit pas exécuté. Assurez-vous que la fin de votre méthode Initialize () définit la propriété Visiblity sur Visible et réinitialise également la Cursor.
  3. Mettez à jour l'extrait de code posté ci-dessus avec l'un des éléments suivants:
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