.Net CF Evita hacer clic demasiado impaciente e impaciente (mientras se redibuja la pantalla)

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

Pregunta

.Net Compact Framework

Escenario: El usuario está en una pantalla. El dispositivo no encuentra una impresora y le pregunta al usuario si desea volver a intentarlo. Si hacen clic en " No " ;, la pantalla actual se cierra y regresan a la pantalla del menú principal. Si hacen clic en el botón " No " botón varias veces, el primer clic será utilizado por el botón No y el siguiente clic tendrá efecto una vez que la pantalla haya terminado de volver a dibujar. (En efecto, al hacer clic en un elemento del menú que luego lleva al usuario a otra pantalla).

No veo un buen lugar para poner un cursor de espera ... no sucede mucho cuando el usuario hace clic en " No " Excepto una forma de cierre. Pero el marco CF es lento para volver a dibujar la pantalla.

¿Alguna idea?

¿Fue útil?

Solución

Pensamientos aleatorios:

  • Deshabilite algunos de los controles en el cuadro de diálogo principal mientras esté activo un cuadro de diálogo modal. No creo que pueda deshabilitar todo el formulario, ya que es el elemento primario del diálogo modal.
  • Alternativamente, sugeriría usar un control transparente para capturar los clics, pero la transparencia no se admite en CF.
  • ¿Cuántos controles hay en el cuadro de diálogo principal? No he encontrado CF.Net tan lento en la actualización. ¿Existe alguna posibilidad de que el cuadro de diálogo esté sobrecargado y se pueda dibujar de forma más rápida que con los controles secundarios?
  • anula la propiedad DialogResult y el método Dispose de la clase para controlar agregar / eliminar un cursor de espera.

Otros consejos

puede omitir los clics pendientes borrando la cola de mensajes de Windows con Application.DoEvents ();

Usamos la siguiente clase de evento personalizada para resolver su problema (evitando múltiples clics y mostrando un cursor de espera si es necesario):

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

}

Puede verificar que funciona con el siguiente ejemplo (las salidas de la consola solo hacen clic si HandleClick ha terminado):

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

}

Para reproducir su problema, cambie el código anterior de la siguiente manera (la consola genera todos los clics, con un retraso):

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

La clase de evento se puede usar para cada control que expone eventos de EventHandler (Button, MenuItem, ListView, ...).

Saludos, tamberg

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top