Mensagens customizadas com MessageDialog na Plataforma Universal do Windows

Neste artigo veremos como exibir mensagens em formato modal em Aplicações Universais do Windows 10 utilizando a classe MessageDialog.

Uma necessidade comum na hora de exibir mensagens para o usuário é apresentar opções personalizadas, além dos botões padrão de Ok, Fechar e semelhantes. Vejamos um exemplo prático na Plataforma Universal do Windows (que vamos chamar somente de UWP).

Passo 1: Mensagens básicas

Exibimos mensagens na UWP através da classe MessageDialog. Em sua forma mais básica, a classe MessageDialog recebe em seu construtor apenas a string de conteúdo, como no código a seguir. Nesse caso, a caixa de diálogo não possuirá título e irá conter apenas um botão Close.


MessageDialog mensagem = new MessageDialog("Conteúdo da mensagem");
await mensagem.ShowAsync();

O resultado é mostrado na Figura 1.

Para adicionar o título na caixa de diálogo, basta informá-lo como segundo parâmetro no construtor da classe:


MessageDialog mensagem = new MessageDialog(
    "Conteúdo da mensagem", "Título da mensagem");

Agora o resultado será o da Figura 2.

Passo 2: Botões customizados

A Listagem 1 mostra como adicionar três opções novas, cada uma com um id distinto, e ler seu resultado em um bloco switch.

Listagem 1. Mensagem com opções customizadas.

MessageDialog mensagem = new MessageDialog("Escolha uma opção.");

mensagem.Commands.Add(new UICommand("Sim") { Id = "S" });
mensagem.Commands.Add(new UICommand("Não") { Id = "N" });
mensagem.Commands.Add(new UICommand("Talvez") { Id = "T" });

var resposta = await mensagem.ShowAsync();

switch (resposta.Id.ToString())
{
    case "S": //Usário clicou Sim
        break;
    case "N": //Usário clicou Não
        break;
    case "T": //Usário clicou Talvez
        break;
}

Quando exibida, essa mensagem terá a forma ilustrada na Figura 3.

Passo 3: Callbacks customizados

No exemplo anterior cada opção tinha um id, a partir do qual tomava-se uma decisão sobre qual ação realizar de acordo com a resposta do usuário. Para este tipo de cenário, também podemos atribuir essa ação customizada diretamente ao comando, podendo inclusive reaproveitá-lo posteriormente.

A classe UICommand possui uma propriedade chamada Invoked, do tipo UICommandInvokedHandler, um delegate para uma função que é executada quando o comando é acionado. Na Listagem 2 vemos como utilizá-la.

Note que agora não é mais necessário tratar a escolha do usuário por meio de um switch, pois cada comando (botão) contém internamente o método que será executado quando ele for acionado. Neste caso, além da preferência do programador, cabe avaliar a possibilidade de reaproveitamento de um comando em outras mensagens.

Listagem 2. Comandos com call-back customizado

MessageDialog mensagem = new MessageDialog("Escolha uma opção.");

UICommand comandoAceitar = new UICommand(
    "Aceitar",
    (cmd) =>
    {
        //Usuário clicou em Aceitar. Fazer algum procedimento adicional.   
    },
    0);
mensagem.Commands.Add(comandoAceitar);

UICommand comandoRejeitar = new UICommand(
    "Rejeitar",
    (cmd) =>
    {
        //Usuário clicou em Rejeitar. Fazer algum procedimento adicional.   
    },
    1);
mensagem.Commands.Add(comandoRejeitar);

await mensagem.ShowAsync();

A assinatura do delegate UICommandInvokedHandler é a seguinte:


public delegate void UICommandInvokedHandler(
  IUICommand command
)

Assim, qualquer método que atenda a essa assinatura pode ser atribuído à propriedade Invoked dos UICommands. Por exemplo, a Listagem 3 mostra um método desse tipo:

Listagem 3. Método para tratar o acionamento do comando

private void TratarBotaoAceitar(IUICommand comando)
{
    //usuário clicou em Aceitar
}

Agora, para utilizá-lo no lugar do método anônimo bastaria fazer como na Listagem 4.

Listagem 4. Utilizando o método criado no UICommand

UICommand comandoAceitar = new UICommand(
    "Aceitar",
    TratarBotaoAceitar,
    0);

Dessa forma, se for preciso, será possível utilizar um mesmo método para tratar as respostas do usuário em várias mensagens.

Artigos relacionados