Net CF Impedir Overzealous, impaciente Clicando (enquanto a tela é redesenhar)
-
03-07-2019 - |
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?
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