Domanda

.Net Compact Framework

Scenario: l'utente è su uno schermo. Il dispositivo non riesce a trovare una stampante e chiede all'utente se desidera riprovare. Se fanno clic su " No " ;, la schermata corrente viene chiusa e ritornano alla schermata del menu principale. Se fanno clic su " No " più volte, il primo clic verrà utilizzato dal pulsante No e il clic successivo avrà effetto una volta completato il ridisegno dello schermo. (In effetti, facendo clic su una voce di menu che porta l'utente su un'altra schermata.)

Non vedo un buon posto per mettere un cursore di attesa ... non succede molto quando l'utente fa clic su & No; No " tranne una chiusura del modulo. Ma il framework CF è lento nel ridisegnare lo schermo.

Qualche idea?

È stato utile?

Soluzione

Pensieri casuali:

  • Disabilita alcuni dei controlli nella finestra di dialogo principale mentre è attiva una finestra di dialogo modale. Non credo che sia possibile disabilitare l'intero modulo poiché è il genitore della finestra di dialogo modale.
  • In alternativa, suggerirei di utilizzare un controllo Trasparente per catturare i clic, ma la trasparenza non è supportata su CF.
  • Quanti controlli ci sono nella finestra di dialogo principale? Non ho trovato CF.Net così lento nell'aggiornamento. C'è qualche possibilità che la finestra di dialogo sia sovraccarica e possa essere personalizzata più velocemente rispetto ai controlli secondari?
  • sovrascrive la proprietà DialogResult e il metodo Dispose della classe per gestire l'aggiunta / correzione di un cursore di attesa.

Altri suggerimenti

puoi saltare i clic in sospeso cancellando la coda dei messaggi di Windows con Application.DoEvents ();

Utilizziamo la seguente classe di eventi personalizzata per risolvere il tuo problema (impedendo più clic e mostrando un cursore di attesa, se necessario):

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

}

Puoi verificare che funzioni con il seguente esempio (gli output della console fanno clic solo se HandleClick è terminato):

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

}

Per riprodurre il problema, modificare il codice sopra riportato come segue (La console genera tutti i clic, con un ritardo):

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

La classe Event può essere utilizzata per tutti i controlli che espongono eventi EventHandler (Button, MenuItem, ListView, ...).

Saluti, Tamberg

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top