Vous pouvez utiliser Cursor.Current
.
// Set cursor as hourglass
Cursor.Current = Cursors.WaitCursor;
// Execute your time-intensive hashing code here...
// Set cursor as default arrow
Cursor.Current = Cursors.Default;
Cependant, si l'opération de hachage est vraiment longue (MSDN définit cela comme plus de 2 à 7 secondes), vous devez probablement utiliser un indicateur de retour visuel autre que le curseur pour informer l'utilisateur de la progression. Pour un ensemble de directives plus approfondies, consultez cet article .
Modifier:
Comme l'a souligné @Am, vous devrez peut-être appeler Application.DoEvents();
après Cursor.Current = Cursors.WaitCursor;
pour vous assurer que le sablier est bien affiché.
Application.UseWaitCursor = true
etApplication.UseWaitCursor = false
Réellement,
définit temporairement le curseur d'attente, mais ne garantit pas qu'il s'affiche jusqu'à la fin de votre opération. D'autres programmes ou contrôles au sein de votre programme peuvent facilement réinitialiser le curseur sur la flèche par défaut, comme cela se produit en fait lorsque vous déplacez la souris alors que l'opération est toujours en cours d'exécution.
Une bien meilleure façon d'afficher le curseur Wait est de définir la propriété UseWaitCursor dans un formulaire sur true:
Cela affichera le curseur d'attente pour tous les contrôles du formulaire jusqu'à ce que vous définissiez cette propriété sur false. Si vous souhaitez que le curseur d'attente s'affiche au niveau de l'application, vous devez utiliser:
la source
En s'appuyant sur la précédente, mon approche préférée (car il s'agit d'une action fréquemment effectuée) consiste à encapsuler le code du curseur d'attente dans une classe d'aide IDisposable afin qu'il puisse être utilisé avec using () (une ligne de code), prendre des paramètres facultatifs, exécuter le code à l'intérieur, puis nettoyer (restaurer le curseur) après.
Usage:
la source
Il est plus facile d'utiliser UseWaitCursor au niveau du formulaire ou de la fenêtre. Un cas d'utilisation typique peut ressembler à ci-dessous:
Pour une meilleure expérience de l'interface utilisateur, vous devez utiliser Asynchrony à partir d'un thread différent.
la source
Mon approche serait de faire tous les calculs dans un travailleur en arrière-plan.
Puis changez le curseur comme ceci:
Et dans l'événement de fin du thread, restaurez le curseur:
Notez que cela peut également être fait pour des contrôles spécifiques, de sorte que le curseur sera le sablier uniquement lorsque la souris est au-dessus d'eux.
la source
OK, j'ai donc créé une méthode asynchrone statique. Cela a désactivé le contrôle qui lance l'action et modifie le curseur d'application. Il exécute l'action en tant que tâche et attend la fin. Le contrôle revient à l'appelant pendant qu'il attend. Ainsi, l'application reste réactive, même lorsque l'icône occupée tourne.
Voici le code du formulaire principal
J'ai dû utiliser un enregistreur distinct pour l'action factice (j'utilise Nlog) et mon enregistreur principal écrit dans l'interface utilisateur (une zone de texte riche). Je n'ai pas pu obtenir le curseur occupé uniquement sur un conteneur particulier du formulaire (mais je n'ai pas essayé très fort.) Tous les contrôles ont une propriété UseWaitCursor, mais cela ne semble pas avoir d'effet sur les contrôles J'ai essayé (peut-être parce qu'ils n'étaient pas au top?)
Voici le journal principal, qui montre les choses qui se passent dans l'ordre que nous attendons:
la source
Avec la classe ci-dessous, vous pouvez faire de la suggestion de Donut une "exception sûre".
la classe CursorHandler
la source
Okey, le point de vue des autres personnes est très clair, mais je voudrais en ajouter quelques-unes, comme suit:
la source
Pour les applications Windows Forms, une désactivation facultative d'un contrôle d'interface utilisateur peut être très utile. Donc, ma suggestion ressemble à ceci:
Usage:
la source
Utilisez ceci avec WPF:
la source