Pergunta

.Net Compact Framework

Cenário: O usuário está em uma tela. O dispositivo não pode encontrar uma impressora e pergunta ao usuário se ele quer tentar novamente. Se eles clique em "Não", a tela atual é fechada e eles são devolvidos para a tela de menu pai. Se eles clique no botão "Não" várias vezes, o primeiro clique será utilizado pelo botão Não e o próximo clique entrará em vigor uma vez que a tela tenha concluído o redesenho. (Com efeito clicar em um item de menu que então leva o usuário para uma outra tela.)

Eu não ver um bom lugar para colocar um cursor de espera ... não há muito acontecendo quando o usuário clica "Não", exceto um fechamento formulário. Mas o quadro CF é lento para redesenhar a tela.

Todas as idéias?

Foi útil?

Solução

pensamentos aleatórios:

  • Desativar a alguns dos controles na caixa de diálogo pai, enquanto uma caixa de diálogo modal é para cima. Eu não acredito que você pode desativar o formulário inteiro, uma vez que é o pai da caixa de diálogo modal.
  • Em alternativa, sugiro usar um controle transparente para pegar os cliques, mas a transparência não é compatível com CF.
  • Quantos controles estão no diálogo pai? Eu não encontrei CF.Net que lento na atualização. Existe alguma chance de que o diálogo está sobrecarregado e pode ser personalizado desenhado mais rápido que com sub controles?
  • substituir a propriedade DialogResult e o método Dispose da classe para lidar com a adição / remvoing um cursor de espera.

Outras dicas

você pode ignorar cliques pendentes por limpar a fila de janelas mensagem com Application.DoEvents ();

Nós usamos a seguinte classe personalizada do evento para resolver seu problema (prevenção de vários cliques e mostrando um cursor de espera, se necessário):

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

}

Você pode verificar se ele funciona com o seguinte exemplo (Console saídas clique somente se handleClick tenha 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 reproduzir a sua alteração problema o código acima da seguinte forma (Console saídas todos os cliques, com um atraso):

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

A classe de evento pode ser usado para cada controle expondo eventos EventHandler (Button, MenuItem, ListView, ...).

Saudações, Tamberg

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top