Affichage du curseur d'attente pendant l'exécution de l'arrière-plan
Lors du démarrage de mon application windows, je dois faire un appel à un service web pour récupérer des données par défaut pour les charger sur mon application. Lors du chargement du formulaire, je lance un backgroundworker pour récupérer ces données. Je veux afficher le curseur d'attente jusqu'à ce que ces données sont récupérées. Comment puis-je faire?
J'ai essayé le réglage du curseur d'attente avant d'appeler le backgroundworker pour s'exécuter. Quand j'ai un rapport de progrès de 100 puis je l'ai mis à la valeur par défaut du curseur. Le curseur d'attente arrive mais quand je bouge la souris, elle disparaît.
Environnement:
- Windows 7 Pro 64 bits
- VS2010 C# .NET 4.0
- Windows Forms
EDIT:
Je suis le réglage du curseur de la façon dont Jay Riggs a suggéré. Il ne fonctionne que si je ne bouge pas la souris.
**Mise à JOUR:
J'ai créé un clic sur un bouton qui est le suivant: Quand je fais le clic sur le bouton et déplacer ma souris, le curseur d'attente apparaît peu importe si je bouge ma souris, ou pas.
void BtnClick()
{
Cursor = Cursors.WaitCursor;
Thread.Sleep(8000);
Cursor = Cursors.Default;
}
Si je fais le suivant: je vois le curseur d'attente et quand je bouge la souris, elle disparaît à l'intérieur de la forme. Si je vais dans ma barre de statut la barre de menu, le curseur d'attente s'affiche.
Cursor = Cursors.WaitCursor;
if (!backgroundWorker.IsBusy)
{
backGroundWorker.RunWorkerAsync();
}
void backGroundWorkerDoWork(object sender, DoWorkEventArgs e)
{
Thread.Sleep(8000);
}
void backGroundWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Cursor = Cursors.Default;
}
Si je ne les suivants: Le curseur d'attente s'affiche et quand je bouge la souris, elle apparaît toujours mais parfois scintillement et s'éteint en cas de déplacement dans les champs de texte. Bien que le curseur se transforme en curseur d'attente, il ne vous empêche pas de cliquer sur quoi que ce soit.
if (!backgroundWorker.IsBusy)
{
backGroundWorker.RunWorkerAsync();
}
void backGroundWorkerDoWork(object sender, DoWorkEventArgs e)
{
UseWaitCursor = true;
Thread.Sleep(8000);
}
void backGroundWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
UseWaitCursor = false;
}
source d'informationauteur arc1880
Vous devez vous connecter pour publier un commentaire.
Ne
UseWaitCursor
travail? (Défini à true lors de l'appel de RunWorkerAsync(), et la valeur false lorsque la réalisation de l'événement est appelé). Qu'utilisez-vous pour mettre le curseur maintenant?Ne pas afficher un curseur d'attente pour cette - au lieu de cela, utilisez un contrôle sur votre formulaire pour indiquer que le composant backgroundworker est occupé à faire quelque chose. Le curseur d'attente est un indicateur approprié pour le thread d'INTERFACE utilisateur à utiliser (car il indique que l'utilisateur ne peut pas/ne devrait pas toucher quoi que ce soit), mais il n'est pas approprié pour quelque chose qui se passe en arrière-plan.
Dans WPF, je l'ai fait par le réglage de la
Mouse.OverrideCursor
propriétéCursors.Wait
avant que je commence le Backgroundworker, puis le remettre ànull
dans leRunWorkerCompleted
événement. Semble fonctionner assez bien pour l'instant.Vous devez utiliser le BGW de RunWorkerCompleted événement à définir votre curseur à la valeur par défaut.
EDIT:
Placez le curseur à attendre en composant ce code avant de démarrer votre BGW:
Réinitialiser votre curseur dans le BGW de RunWorkerCompleted événement par:
Dans le MS forums fil UseWaitCursor pas de travail mais de Curseur = Curseurs.WaitCursor fait../ & Le curseur.Par rapport à cela.Curseur
il a été confirmé que WF de la mise en œuvre de UseWaitCursor manqué une occasion de le faire réellement travailler pour afficher un curseur sablier et montré le Sablier de la classe, qui peut être utilisé avec "l'aide" bloc
Quelque chose d'autre doit être le réglage du curseur. Le code ci-dessous définit un curseur d'attente lorsque le compte à rebours commence, et puis place le curseur à la valeur précédente après l'expiration de la minuterie. Il fonctionne comme prévu: le curseur d'attente reste tout au long de l'intervalle. Bien sûr, en déplaçant le curseur à l'extérieur de la forme montrera le curseur pour quelle que soit la fenêtre le curseur de la souris est sur, mais revenir à ma forme montre le curseur d'attente.
La Microsoft Source De Référence nous donne de la mise en œuvre de De contrôle.UseWaitCursor et De contrôle.Curseur. Si vous examinez de Contrôle.Curseur, vous verrez que si UseWaitCursor est définie sur True, le Contrôle.Le curseur retourne la position du Curseur.WaitCursor indépendamment de ce curseur est mis sur le contrôle. En raison de ce comportement, la valeur de retour de la commande.Le curseur ne peut pas être mis en cache.
Alors que le ci-dessus semble assez inoffensif, il peut instantanément causer des problèmes si quelqu'un met de Contrôle.UseWaitCursor à Vrai avant qu'il soit exécuté. Le résultat de ce qui serait coincé curseur d'attente en raison d'un Contrôle.Curseur de retour Curseurs.WaitCursor sur la première ligne ci-dessus. Une meilleure méthode pour changer le curseur est donc:
Pour la grande majorité des choses, le dessus doit être suffisant pour afficher un curseur d'attente en cas de besoin. Toutefois, si un enfant d'un contrôle modifie également le curseur, le curseur fixé par l'enfant va remplacer celui qui est défini sur le parent. C'est à dire si vous réglez le curseur d'un label pour les Curseurs.Tringle en " i " sur un formulaire qui définit son curseur Curseurs.WaitCursor, l'étiquette affiche une tringle en "i", tandis que le formulaire affiche les WaitCursor. Seuls les contrôles de Contrôle.Le curseur retourne la même valeur que le Contrôle.DefaultCursor affichera le WaitCursor mis sur la forme dans ce cas. C'est là que le Contrôle.UseWaitCursor. Réglage UseWaitCursor sur une forme d'ensembles de UseWaitCursor sur l'ensemble de ses enfants. Tant qu'aucun des contrôles sur le formulaire à l'aide de l'cassé le code ci-dessus. Le DataGridView est seulement un des nombreux contrôles qui ont utilisé le code cassé au-dessus.
Mais.. si vous ne voulez pas un WaitCursor et que vous voulez maintenir le curseur à l'extérieur par un utilisateur de votre contrôle? Dans ce cas, vos options sont limitées, vous devez remplacer le Curseur de la propriété de votre commande pour recevoir le curseur définie par un utilisateur de votre commande OU vous devez utiliser la réflexion pour accéder à l'intérieur du curseur de la valeur stockée par la classe de Contrôle de base. Alors, et seulement alors pouvez-vous utiliser la première méthode ci-dessus pour la mise en cache et la restauration du curseur. *Remarque: vous devez cache interne curseur de la valeur définie par l'utilisateur, de votre contrôle, le résultat non pas à partir de la base.Le curseur!
Ici est ce que je fais maintenant, j'espère que cette aide.
Il y a beaucoup de réponses ici déjà, mais j'ai trouvé une autre solution qui a marché pour moi, donc j'avais pensé que je liste de.
- Je utiliser à la fois en ligne et il semble travailler à la manière dont je m'attends tout le temps. Surtout quand je veux avoir un curseur d'attente tout en montrant un travailleur est en cours d'exécution. Espérons que cela aide quelqu'un d'autre, toujours à la recherche.