Silverlight OpenFiledialog Doevents equivalente
-
20-09-2019 - |
Pergunta
Estou processando arquivos grandes depois de serem selecionados pelo usuário. Meu código parece o seguinte:
if (FileDialog.ShowDialog() == true) {
// process really big file
}
Isso congela a interface do usuário, então tentei exibir uma mensagem de carregamento antes de um usuário selecionar o arquivo para dar a eles uma sugestão visual de que algo estava acontecendo:
loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) {
// process really big file
}
Infelizmente, isso ainda congela completamente a interface do usuário enquanto o arquivo está sendo processado.
O que eu descobri que funciona perfeitamente é se eu disparar uma caixa de mensagem logo após a seleção de arquivos. Eu acho que ele faz uma chamada do tipo "Doevents" sob o capô para obter itens de eventos/interface do usuário nivelados no tempo de execução.
loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) {
MessageBox.Show("Sync!");
// process really big file
}
Em casos como esse, o grande arquivo ainda é processado como lentamente, mas a mensagem de carregamento é exibida e a interface do usuário da tela é sincronizada (estou fazendo outras coisas na coisa real, como mostrar um cursor de espera).
Pergunta:
Silverlight não tem funcionalidade doevents. Existe uma chamada que posso fazer além do MessageBox.Show para ter o mesmo efeito de sincronizar a interface do usuário e impedir que o OpenFiledialog de congelar a interface do usuário?
Solução
Use um trabalho de fundo para executar o cálculo pesado em segundo plano. Quando você deseja notificar a interface do usuário de que a operação está concluída, o evento RunWorkerCompleted da classe mencionado pode ser usado. A alternativa a isso é usar um encadeamento completamente separado e, em seguida, retorno de chamada para o thread da interface do usuário usando o Dispatcher.begininvoke (). Lembre -se de que, com .NET em um encadeamento separado, você não pode acessar nenhum componente da GUI sem esse tipo de sincronização.
Outras dicas
Use a classe BackgroundWorker para processar seu arquivo realmente grande em um thread de segundo plano? Aqui um link para você: Como: usar um trabalho de fundo