.Net CF Empêchez de cliquer avec excès de zèle et d'impatience (pendant le redessinage de l'écran)

StackOverflow https://stackoverflow.com/questions/153496

Question

.NET Compact Framework

Scénario: l'utilisateur est sur un écran. Le périphérique ne trouve pas d'imprimante et demande à l'utilisateur s'il souhaite réessayer. S'ils cliquent sur "Non", l'écran actuel est fermé et ils sont renvoyés à l'écran du menu parent. S’ils cliquent sur le bouton "Non". bouton plusieurs fois, le premier clic sera utilisé par le bouton Non et le prochain clic prendra effet une fois que l'écran aura été redessiné. (En fait, vous cliquez sur un élément du menu qui conduit ensuite l’utilisateur à un autre écran.)

Je ne vois pas le bon endroit pour placer un curseur d'attente ... il n'y a pas grand chose qui se passe quand l'utilisateur clique sur "Non". sauf une fermeture de formulaire. Mais la structure des FC tarde à redessiner l’écran.

Des idées?

Était-ce utile?

La solution

Pensées aléatoires:

  • Désactive certains des contrôles de la boîte de dialogue parent lorsqu'une boîte de dialogue modale est active. Je ne crois pas que vous puissiez désactiver l’ensemble du formulaire, car c’est le parent du dialogue modal.
  • Je suggérerais également d'utiliser un contrôle Transparent pour capturer les clics, mais la transparence n'est pas prise en charge sur CF.
  • Combien de contrôles y a-t-il dans la boîte de dialogue parent? Je n'ai pas trouvé CF.Net si lent dans la mise à jour. Existe-t-il une chance que la boîte de dialogue soit surchargée et puisse être personnalisée plus rapidement avec les sous-contrôles?
  • substitue la propriété DialogResult et la méthode Dispose de la classe pour gérer l'ajout / le retrait d'un curseur d'attente.

Autres conseils

vous pouvez ignorer les clics en attente en effaçant la file de messages Windows avec Application.DoEvents ();

Nous utilisons la classe d'événements personnalisée suivante pour résoudre votre problème (prévention des clics multiples et affichage d'un curseur d'attente si nécessaire):

using System;
using System.Windows.Forms;

public sealed class Event {

    bool forwarding;

    public event EventHandler Action;

    void Forward (object o, EventArgs a) {
        if ((Action != null) && (!forwarding)) {
            forwarding = true;
            Cursor cursor = Cursor.Current;
            try {
                Cursor.Current = Cursors.WaitCursor;
                Action(o, a);
            } finally {
                Cursor.Current = cursor;
                Application.DoEvents();
                forwarding = false;
            }
        }
    }

    public EventHandler Handler {
        get {
            return new EventHandler(Forward);
        }
    }

}

Vous pouvez vérifier qu'il fonctionne avec l'exemple suivant (les sorties de la console ne cliquent que si HandleClick est terminé):

using System;
using System.Threading;
using System.Windows.Forms;

class Program {

    static void HandleClick (object o, EventArgs a) {
        Console.WriteLine("Click");
        Thread.Sleep(1000);
    }

    static void Main () {
        Form f = new Form();
        Button b = new Button();
        //b.Click += new EventHandler(HandleClick);
        Event e = new Event();
        e.Action += new EventHandler(HandleClick);
        b.Click += e.Handler;
        f.Controls.Add(b);
        Application.Run(f);
    }

}

Pour reproduire votre problème, modifiez le code ci-dessus comme suit (la console génère tous les clics avec un retard):

        b.Click += new EventHandler(HandleClick);
        //Event e = new Event();
        //e.Action += new EventHandler(HandleClick);
        //b.Click += e.Handler;

La classe Event peut être utilisée pour chaque contrôle exposant des événements EventHandler (Button, MenuItem, ListView, ...).

Cordialement, tamberg

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top