Para uma visão construída usando WPF, quero mudar o cursor do mouse para uma ampulheta quando o aplicativo está ocupado e não responde.
Uma solução é adicionar
this.Cursor = Cursors.Wait;
a todos os locais que podem fazer com que a IU deixe de responder. Mas obviamente esta não é a melhor solução. Estou me perguntando qual é a melhor maneira de conseguir isso?
É possível conseguir isso usando Estilos ou Recursos?
Obrigado,
using(uiServices.ShowWaitCursor())
. Parece complicado, mas facilita os testes de unidade.Usei as respostas aqui para construir algo que funcionasse melhor para mim. O problema é que, quando o bloco using na resposta de Carlo termina, a IU pode ainda estar ocupada com a ligação de dados. Pode haver dados de carregamento lento ou eventos disparados como resultado do que foi feito no bloco. No meu caso, às vezes, demorava vários segundos para que o cursor de espera desaparecesse até que a IU estivesse realmente pronta. Eu resolvi isso criando um método auxiliar que define o waitcursor e também se encarrega de configurar um cronômetro que irá definir automaticamente o cursor de volta quando a IU estiver pronta. Não posso ter certeza de que este design funcionará em todos os casos, mas funcionou para mim:
fonte
Estou simplesmente fazendo
De acordo com a documentação da Propriedade Mouse.OverrideCursor
A instrução try-finally garante que o cursor padrão seja restaurado em qualquer caso, mesmo quando ocorre uma exceção ou a parte try é deixada com
return
oubreak
(se estiver dentro de um loop).fonte
A melhor maneira seria não fazer com que a IU nunca respondesse, transferindo todo o trabalho para outros threads / tarefas conforme apropriado.
Fora isso, você está meio que em um beco sem saída: se você adicionou uma maneira de detectar que a interface do usuário não está respondendo, não há uma boa maneira de mudar o cursor, como o lugar que você precisa para fazer isso ( o segmento uniforme) não responde ... Você pode ser capaz de identificar o código win32 padrão para alterar o cursor para a janela inteira, entretanto?
Caso contrário, você teria que fazer isso preventivamente, como sugere sua pergunta.
fonte
Eu pessoalmente prefiro não ver o ponteiro do mouse mudando muitas vezes da ampulheta para a seta. Para ajudar a evitar esse comportamento ao chamar funções incorporadas que demoram um pouco e cada uma tenta controlar o ponteiro do mouse, uso uma pilha (contador) que chamo de LifeTrackerStack. E só quando a pilha está vazia (contador a 0) é que coloco a ampulheta de volta em uma seta.
Eu também uso MVVM. Eu também prefiro o código de thread seguro.
Em minha classe raiz de modelo, declaro meu LifeTrackerStack que preencho as classes de modelo filho ou uso diretamente de classes de modelo filho quando tenho acesso a ele.
Meu rastreador de vida tem 2 estados / ações:
Então, na minha opinião, eu vinculo manualmente ao meu Model.IsBusy e faço:
Esta é minha classe LifeTrackerStack:
E o uso dele:
Onde quer que eu corra demoradamente, eu faço:
Funciona para mim. Espero que possa ajudar alguém! Eric
fonte
Tenha cuidado aqui porque mexer no Cursor de Espera pode causar alguns problemas com threads STA. Certifique-se de que, se usar isso, você o está fazendo em seu próprio encadeamento. Publiquei um exemplo aqui Executar dentro de um STA que usa isso para mostrar um WaitCursor enquanto o arquivo gerado está iniciando, e não explode (o aplicativo principal) AFAICT.
fonte
Alterar o cursor não significa que o aplicativo não responderá aos eventos do mouse e do teclado após o término da longa tarefa. Para evitar enganos do usuário, uso a classe abaixo que remove todas as mensagens do teclado e do mouse da fila de mensagens do aplicativo.
fonte
Usei a solução do Olivier Jacot-Descombes, é muito simples e funciona bem. obrigado. update: ele até funciona bem sem usar um thread / trabalhador de plano de fundo diferente.
Eu o uso com o backgroudworker, o cursor do mouse fica ótimo quando está ocupado trabalhando e volta ao normal quando o trabalho está concluído.
fonte
Eu sei que estou atrasado, acabei de mudar a forma como gerencio o cursor Hourglass (estado ocupado) do meu aplicativo.
Esta solução proposta é mais complexa do que minha primeira resposta, mas acho que é mais completa e melhor.
Eu não disse que tenho uma solução fácil ou completa. Mas, para mim, é o melhor porque principalmente corrige todos os problemas que tive ao gerenciar o estado de ocupado do meu aplicativo.
Vantagens:
O código é separado em algumas classes:
Este é o uso:
Iniciar:
Uso preferido:
Outro uso:
Cursor da janela automática:
Código:
fonte