Frage

.Net Compact Framework

Szenario: Der Nutzer ist auf einem Bildschirm. Das Gerät kann findet keinen Drucker und fragt den Benutzer, ob sie es noch einmal versuchen wollen. Wenn sie „Nein“ klicken, wird der aktuelle Bildschirm geschlossen und sie werden an den übergeordneten Menübildschirm zurück. Wenn sie die Schaltfläche „Nein“ mehrere Male klicken, wird der erste Klick durch die Wirkung erfolgt keine Taste und dem nächsten Klick verwendet werden, sobald der Bildschirm neu gezeichnet abgeschlossen hat. (In der Tat um einen Menüpunkt zu klicken, die dann den Benutzer auf einem anderen Bildschirm rufen.)

Ich sehe nicht, einen guten Ort, um einen Wartecursor setzen ... es nicht viel passiert, wenn der Benutzer klickt auf „Nein“ außer Form Schließung. Aber der CF-Framework ist langsam, um den Bildschirm neu zu ziehen.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Random Gedanken:

  • Deaktivieren Sie die einige der Kontrollen auf den übergeordneten Dialog während ein modaler Dialog auf. Ich glaube nicht, dass Sie das gesamte Formular deaktivieren können, da sie die Eltern des modalen Dialogs sind.
  • Alternativ würde ich vorschlagen, eine transparente Kontrolle über die Klicks zu fangen, aber Transparenz ist nicht auf CF unterstützt.
  • Wie viele Steuerelemente sind auf dem übergeordneten Dialog? Ich habe nicht CF.Net festgestellt, dass langsam in Aktualisierung. Gibt es eine Chance, dass der Dialog überlastet ist und benutzerdefinierte werden könnte gezogen schneller als bei den Unter Kontrollen?
  • überschreibt die Dialog Eigenschaft und die Dispose-Methode der Klasse Hinzufügen zu handhaben / eine Wartecursor remvoing.

Andere Tipps

Sie können anhängige Klicks überspringen, indem die Windows-Nachrichtenwarteschlange Clearing mit Application.DoEvents ();

Wir verwenden die folgenden benutzerdefinierten Event-Klasse Ihr Problem (verhindert mehrere Klicks und zeigt einen Wartecursor falls erforderlich) zu lösen:

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);
        }
    }

}

Sie können überprüfen, ob es mit dem folgenden Beispiel arbeitet (Console Ausgänge klicken nur, wenn handle beendet hat):

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);
    }

}

Ihr Problem des obigen Code ändern zu reproduzieren wie folgt (Console alle Klicks ausgibt, mit einer Verzögerung):

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

Die Event-Klasse kann für jede Steuerung verwendet werden aussetzt Eventhandler Ereignisse (Button, MenuItem, Listview, ...).

Viele Grüße, Tamberg

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top