Pergunta

Um tempo atrás eu encontrei uma situação onde se necessário para exibir mensagens de caixas para o usuário para as notificações, mas não podíamos usar MessageBox.Show porque bloqueia o segmento de GUI (então nada na tela é atualizado enquanto o diálogo é ativo). Todas as sugestões sobre uma alternativa?

[I codificado uma alternativa no momento, mas eu não gosto dele. Eu vou postá-lo como uma resposta se nada melhor aparece embora]

EDIT: o diálogo deve flutuar no topo da janela principal; eu não me importo se ele aparecer na barra de tarefas ou não. Mais do que um diálogo pode ser ativas ao mesmo tempo em determinadas circunstâncias.

ADENDO: minha solução era uma forma de base que forneceu botões OK e Cancelar para emitir eventos concluídos e cancelados; OK chamado de ValidateData virtual para substituir subclasse. A forma chamando usado propriedades para evitar a recriação da forma de cada vez (a forma foi apenas oculta em vez de fechado) e mantido um dicionário de formas activas para prevenir a mesma forma seja activado mais do que uma vez. Isto parece um formulário modal, suporta múltiplas formas de pop-up de uma só vez, mas não amarrar o segmento principal GUI.

Foi útil?

Solução

Eu concordo com rslite e Mitchel Sellers. Criação de uma forma não-modal para exibir a informação necessária é o melhor caminho a percorrer. Se você tiver várias mensagens, você pode querer considerar colocá-los em uma caixa de listagem e têm o usuário clicar duas vezes sobre eles para obter as informações completas a necessidade de ser exibido.

Outras dicas

Eu sugiro ir com uma abordagem não-modal, como outros disseram, mas um pouco mais específico:

  • Se você quer apenas uma notificação, você pode tentar uma dica de balão (TNA ou a sua própria), ou uma janela que é como a notificação de correio Outlook ou a notificação muitos mensageiros instantâneos como exibição Trillian.
  • Se você só quer dar ao usuário a chance de agir, use uma forma não-modal, mas lembre-se que ele poderia muito bem basta clicar nele distância.
  • Se o usuário deve agir de acordo com a sua mensagem, você deve ir modal. Note que a janela do proprietário ainda será pintado e você pode atualizar o seu GUI - um diálogo modal, afinal, tem uma bomba de mensagem, caso contrário ele não iria funcionar. Eu fiz algo parecido recentemente, tivemos uma piscina segmento de trabalho de fundo que levaria em quaisquer ações e eventos de fogo para a GUI para atualização, e uma janela de espera modal que ainda tem bombear suas mensagens. A janela proprietário fez update com a ação de fundo como esperado.

O que sobre a adição de um NotifyIcon à sua candidatura e apresentar um balão ponta . O lado ruim é que a notificação desaparecerá depois de um curto período de tempo, mas talvez que é melhor para seus usuários se eles não precisam de tomar medidas.

Gostaria de resolver isso usando uma caixa de diálogo não modal ou talvez algumas dicas de ferramentas, dependendo das necessidades específicas.

Se você não quer que o bloqueio, eu tinha acabado de criar o seu próprio formulário simples para fazer o display. É assim que eu tiver concluído itens para os clientes antes, quando era necessária uma solução non-blocking. Mas tenha em mente que se você fazê-lo como sem bloqueio que os usuários poderiam obter múltiplos para cima e ser oprimido se eles são realmente "é preciso agir" itens do tipo.

agradecimentos a todos que contribuíram com sugestões, parece que a minha solução foi sobre à direita; -)

minha solução era uma forma de base que forneceu botões OK e Cancelar para emitir eventos concluídos e cancelados; OK chamado de ValidateData virtual para substituir subclasse. A forma chamando usado propriedades para evitar a recriação da forma de cada vez (a forma foi apenas oculta em vez de fechado) e mantido um dicionário de formas activas para prevenir a mesma forma seja activado mais do que uma vez. Isto parece um formulário modal, suporta múltiplas formas de pop-up de uma só vez, mas não amarrar o segmento principal GUI.

Se você quer o olhar MessageBox e sentir-se apenas mostrá-lo em uma discussão de fundo.

ThreadPool.QueueUserWorkItem( (state) =>
    {
         MessageBox.Show("Your message");
    });

(código não testado)

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