6
votes

C # faire un programme attendre le bouton pour être enfoncé

Je veux que le programme attendra un bouton d'attente d'un bouton avant qu'il ne continue, j'ai essayé de créer une boucle tandis que de la boucle et de la faire boucle jusqu'à ce que le bouton soit cliqué et définit un BOOL sur TRUE pour que la boucle tandis que la boucle est terminée. Il écrase

while (!Redpress)
{
    // I'd like the wait here
}

Redpress = false;


2 commentaires

L'événement Button est déjà là, j'ai besoin du programme pour attendre l'événement.


Vous ne pouvez pas écrire de code comme celui-ci dans un fil d'interface utilisateur. Il gèlera l'interface utilisateur. La compréhension de la nature axée sur les événements de la programmation de l'interface utilisateur est essentielle pour aller de l'avant.


4 Réponses :


6
votes

Utiliser des événements - c'est ce qu'ils sont conçus pour.

Vous n'avez pas besoin d'utiliser une variable booléenne pour cela dans le Button_Click Code> Mouvement d'événement Appelez votre code: P> xxx pré>

Comme @TrickDev signalé, vous devrez vous abonner à cet événement, mais si vous utilisez la fenêtre d'événements dans Visual Studio, il ajoutera le code nécessaire - y compris le gestionnaire vide - pour vous. P>

Avec des programmes pilotés par événement, vous attendez toujours jusqu'à ce que la prochaine "chose" arrive. Donc, dans votre cas (si j'ai bien compris votre application) lorsque vous démarrez le programme, il faut simplement indiquer le premier bouton de clignoter «N» Times. Si vous écrivez cela comme étant donné que l'application reviendra à l'état d'attente une fois que le code est terminé. P>

puis dans la touche, cliquez sur le gestionnaire d'événements - Vous pouvez souscrire tous les boutons au même événement - vous pouvez vérifier que le bouton correct a été appuyé et indiquez ensuite le bouton Suivant de clignoter. Si vous appuyez sur le bouton incorrect, affichez un message approprié. P>

Donc, dans le code pseudo, vous avez: P>

public class Form
{
    Initialise()
    {
        this.Loaded += FormLoaded;
    }

    private void FormLoaded(object sender, EventArgs e)
    {
        // pick a button
        pickedButton.Flash();
    }

    private void Button_Click(object sender, EventArgs e)
    {
        if (sender == pickedButton)
        {
            pickedButton = pickButton();
        }
        else
        {
            message = "Sorry wrong button, try again";
        }

        pickedButton.Flash();
    }
}

public class Button
{
    public void Flash()
    {
        // loop N times turning button on/off
    }
}


7 commentaires

Cela n'a pas de sens, RedDrimer est un BOOL qui définit si le bouton a été cliqué ou non, j'ai déjà un événement pour définir le BOOL sur true lorsque le bouton est enfoncé. J'ai besoin de code pour faire attendre le programme pour l'événement ...


@ Zizo47 - Désolé, j'ai mal compris - Mettez le code dont vous avez besoin dans le gestionnaire où j'ai indiqué avec le commentaire.


Cela ne change toujours rien, j'ai besoin du programme pour arrêter et attendre que je clique sur le bouton, je n'ai aucun problème avec le bouton lui-même.


@ Zizo47 - Que voulez-vous dire par "arrêter". Si vous mettez le code à l'intérieur Le gestionnaire d'événements, il ne sera pas exécuté tant que le bouton est enfoncé.


Permettez-moi d'expliquer un peu plus, c'est un jeu Simon, son attente clignote sur le bouton que l'utilisateur doit appuyer, puis "attend" pour que l'utilisateur appuie dessus. Je tiens à le faire attendre dans les contraintes de ce code, il ne continuera donc pas tant que le bouton est enfoncé.


@ ZIZO47 - Je ne comprends pas complètement le problème - vous voulez que le bouton flash "n" puis puis s'arrête et le bouton suivant clignote uniquement lorsque l'utilisateur clique sur le premier? Dans ce cas, tout ce que vous avez le code "principal" doit faire, c'est dire au premier bouton de clignoter. Le programme attendra ensuite jusqu'à ce qu'il devienne une entrée supplémentaire - dans ce cas, appuyez sur le bouton. Si c'est le bon, vous pouvez ensuite dire au bouton suivant de clignoter.


Ne vous inquiétez pas, j'ai fait un peu de recherche et apparemment ce que je demande, c'est assez dur. Je vais juste changer le code entier, merci pour votre temps de toute façon.



2
votes

Les commandes de formulaires Windows ont un événement de clic que vous pouvez vous abonner à dans le constructeur de formulaire:

mre.WaitOne();


1 commentaires

Tout ce que vous avez fait, il est fait redressement sur False avec un événement, j'ai besoin du programme pour attendre "cet" événement ...



0
votes

Si vous avez besoin du programme pour attendre cet événement, n'écrivez pas le code Waitfortonbutton dans votre principal accès / page de page strong>.

Écrivez votre code à l'intérieur em > L'événement. Donc, vous n'avez pas besoin de faire une attente active. Les événements sont pour cela. P>

par exemple: si vous avez quelque chose comme ça p> xxx pré>

alors vous pouvez le modifier à: p>

static void Main
{
    myButton.OnClick += myButton_EventHandler;
}

private void myButton_EventHandler(object sender, EventArgs e)
{
    DoThis();
    DoThat();
}                                     


0 commentaires

0
votes

Je ne sais pas pourquoi tu veux coller là-bas, ce que je crois, c'est le vrai problème. Je suppose que vous êtes dans un code où vous souhaitez dans certains cas exécuter un autre code lors de l'action de l'utilisateur, puis reprenez le code restant dans le bloc principal.

Lorsque je traite de tels cas, j'utilise une classe de contrôleurs de la file d'attente. La classe ajoute-t-elle en fait une addition (action), PlayNext () et des inactions ()

Donc, à ce point de votre part, j'ajoute le code après votre boucle à une action dans ma classe et do Addaction.

i fait aussi addaction (action, position) au bout du bouton, puis tandis que Haçages () PlayNext ()

De cette façon, je ne bloque pas l'interface et assurez-vous que le code du bouton fonctionne entre mes 2 morceaux de code.


0 commentaires