web-dev-qa-db-fra.com

Afficher un spinner pendant qu'un programme Windows Forms est "en cours de traitement", similaire à ajaxStart/ajaxStop?

Oui oui. Je sais que ce sont 2 technologies complètement différentes. Je suis récemment passé au développement FAT avec C # et Windows Forms à partir du développement Web. J'ai toujours pensé qu'il était très facile de montrer un spinner à l'aide de ajaxStart et ajaxStop, afin que l'utilisateur sache qu'il se passe quelque chose et qu'il continue d'attendre.

Existe-t-il une technique simple et équivalente pour les Windows Forms C # pouvant être implémentée globalement? Par exemple, si j'interroge une base de données et que j'attends certains résultats, normalement, le programme ne répond plus pendant quelques secondes, puis recommence à fonctionner après le "traitement". Existe-t-il un moyen global d’afficher un compteur pendant que mon programme est en train de "traiter" au lieu d’identifier tous les points possibles du programme qui pourraient le rendre insensible et en extrayant de nouveaux fils?

S'il vous plaît laissez-moi savoir si je ne suis pas clair.

17
bulltorious

La méthode standard Windows Forms pour le faire est Cursor.Current = Cursors.WaitCursor;.

Est-ce que cela fonctionne pour vous ou est-ce que cela doit être une image?

45
Blorgbeard

J'utilise Visual Studio Enterprise 2015. Les styles/types de curseur suggérés indiqués ici, aucun d'entre eux n'a fonctionné avec moi.

Celui qui travaille avec moi est:

private async void button_Click(object sender, RoutedEventArgs e)
{
    Cursor = Cursors.Wait; // change cursor to hourglass type
    ThatProcessThatTookVeryLongTime();
    Cursor = Cursors.Arrow; // change cursor to normal type
}
10
Amirizzuan

Puis-je ajouter ceci CodeProject link ?

Tout ce dont vous avez besoin est de construire, faire glisser depuis la barre d’outils et de l’utiliser. Le composant LoadingCircle fonctionne sans aucun problème. Fonctionne comme un charme, vous pouvez même le personnaliser!

10
Joel

C’est ce que j’aime utiliser lorsque j’ai besoin d’un curseur d’attente; au lieu d'écrire un code try-finally.

    #region WaitCursor
    public static IDisposable BeginWaitCursorBlock()
    {
        return ((!_waitCursorIsActive) ? (IDisposable)new waitCursor() : null);
    }
    private static bool _waitCursorIsActive;
    private class waitCursor : IDisposable
    {
        private Cursor oldCur;
        public waitCursor()
        {
            _waitCursorIsActive = true;
            oldCur = Cursor.Current;
            Cursor.Current = Cursors.WaitCursor;
        }
        public void Dispose()
        {
            Cursor.Current = oldCur;
            _waitCursorIsActive = false;
        }
    }
    #endregion

Exemple d'utilisation:

using (BeginWaitCursorBlock())
{
  ...
}
5
Koray

Avant le traitement: Cursor.Current = Cursors.WaitCursor;

ProcessusQuelque chose ();

Après le traitement: Cursor.Current = Cursors.AppStarting;

1
Milton Quirino

Si votre programme ne répond plus, c'est que vous effectuez un travail réel sur le fil de l'interface utilisateur. Déplacez le travail vers un fil d’arrière-plan, désactivez si nécessaire l’interaction de l’UI pour empêcher l’utilisateur de toucher à son contenu, puis, lorsque le travail d’arrière-plan est terminé, réacheminez les résultats vers le fil de l’UI à l’aide de Control.Invoke, puis mettez à jour votre interface utilisateur avec résultats, puis réactivez tout.

Pour mettre en œuvre le spinner, j'utilise un PictureBox avec un spinner gif. Je le désactive lorsque l’interface utilisateur est inactive et l’active lorsque j’allume le travailleur d’arrière-plan. 

L'alternative consiste à changer le curseur de la souris en curseur "en attente", ce dont je ne suis pas un grand fan.

1
antiduh

Depuis .NET 4.5 (VS 2015+), vous pouvez utiliser une combinaison d'async et d'attendre avec Progress pour envoyer des mises à jour au fil de l'interface utilisateur:

cliquer pour ouvrir Related Artical

0
BJ Patel

oui il y a.

Le plus simple était de créer deux méthodes d’utilité, l’une pour activer l’indicateur de «chargement» et l’autre pour désactiver cet état de chargement.

Lors de tous les appels ajax initiaux (ou de tout autre appel long), appelez automatiquement la méthode enable.

dès qu'un rappel oncomplete est déclenché, appelez la méthode disable à partir du rappel oncomplete.

0
Kristian