Comment bien mettre en pause/retard application Windows Forms
Je suis un débutant à la POO et le C#.
Je suis en train de travailler sur un jeu de quiz en utilisant les Formulaires Windows.
Mon problème est lié à deux classes, la forme et la logique de jeu.
J'ai une INTERFACE utilisateur de base, avec les classiques de la Froms contrôles. Prendre un coup d'oeil.
La chose que je veux réaliser est, quand un joueur appuie sur aucun bouton réponse, il higlight qui a pressé le bouton en rouge ou vert, selon si elle est bonne ou de mauvaise réponse. Après la modification de la couleur que je veux le programme d'attendre un peu, et puis aller à la prochaine question.
Problème est que je ne sais pas comment atteindre cet objectif correctement. Je ne sais pas comment travailler avec les fils et comment exactement la Forme app liées aux threads. Dois-je utiliser un fil de sommeil ou une minuterie ou un async?
Je vais vous montrer la méthode de la logique de jeu de la classe qui doit gérer cela.
public static void Play(char answer) //Method gets a char representing a palyer answer
{
if (_rightAnswer == answer) //If the answer is true, the button should become green
{
Program.MainWindow.ChangeBtnColor(answer, System.Drawing.Color.LightGreen);
_score++;
}
else //Otherwise the button becomes Red
{
Program.MainWindow.ChangeBtnColor(answer, System.Drawing.Color.Red);
}
//SLEEP HERE
if (!(_currentIndex < _maxIndex)) //If it is the last question, show game over
{
Program.MainWindow.DisplayGameOver(_score);
}
else //If it is not the last question, load next question and dispaly it and finally change the button color to default
{
_currentIndex++;
_currentQuestion = Database.ListOfQuestions.ElementAt(_currentIndex);
_rightAnswer = _currentQuestion.RightAnswer;
Program.MainWindow.DisplayStats(_score, _currentIndex + 1, _maxIndex + 1);
Program.MainWindow.DisplayQuestion(_currentQuestion.Text);
Program.MainWindow.DisplayChoices(_currentQuestion.Choices);
}
Program.MainWindow.ChangeBtnColor(answer, System.Drawing.SystemColors.ControlLight);
}
Je ne veux pas bloquer complètement l'INTERFACE utilisateur, mais aussi je ne veux pas que les utilisateurs de faire d'autres événements en appuyant sur d'autres boutons pendant la pause. Parce qu'il va entraîner une mauvaise exécution de l'application.
Vous devez vous connecter pour publier un commentaire.
Si le programme est vraiment simple et vous ne souhaitez pas mettre en place des Threads, je voudrais suggérer à l'aide de la Minuterie. Il suffit de commencer votre Minuterie lorsque vous cliquez du bouton réponse. Votre minuterie doit contenir une fonction qui permettrait de s'arrêter après un certain temps et faire d'autres actions nécessaires (par exemple, choisissez une autre question).
Une fois que l'utilisateur a sélectionné une réponse, vous pouvez désactiver tous les boutons de sorte qu'ils ne peuvent pas appuyer sur autre chose.
Puis démarrer une minuterie afin de ne pas bloquer l'INTERFACE utilisateur. La minuterie est fondamentalement un fil, mais s'occupe de toutes les enfiler pour vous de sorte que vous n'avez pas à vous soucier de cet aspect.
Lorsque la minuterie atteint le délais souhaité arrêter et de mettre le feu à un événement pour sélectionner la prochaine question.
À //à DORMIR ICI ajouter cette ligne de code
Le 2000 est de quelques millisecondes et est le temps d'attente, timerCb est un appel de retour de la méthode.
Également en vertu de cette désactiver tous les boutons de sorte que de nouveaux événements ne sera pas généré.
Vous pouvez faire ce que vous voulez dans le rappel, cependant, si vous faites quelque chose qui allait changer quoi que ce soit dans l'INTERFACE utilisateur, vous devez utiliser le Répartiteur comme j'ai changer l'étiquette de contenu.
La suspension de l'exécution dans une interface graphique, le scénario est très facile grâce à
await
:Cela ne veut pas bloquer l'INTERFACE utilisateur.
Vous devriez la recherche de ce
await
et comment l'utiliser. Si vous n'avez jamais entendu parler d'elle et de la programmation WinForms vous faites quelque chose de mal.Pas de minuteries ou de fils sont nécessaires. Pas de rappels, pas de
Invoke
.