Como fechar uma janela ou caixa de diálogo (WPF .NET)

Neste artigo, você aprenderá sobre as diferentes maneiras de fechar uma janela ou caixa de diálogo. Um usuário pode fechar uma janela usando os elementos na área não cliente, incluindo o seguinte:

  • O item Fechar do menu Sistema.
  • Pressionando ALT+F4.
  • Pressionando o botão Fechar.
  • Pressionando ESC quando um botão tem a propriedade IsCancel definida como true em uma janela modal.

Ao projetar uma janela, forneça mais mecanismos para a área do cliente para fechar uma janela. Alguns dos elementos de design comuns em uma janela que são usados para fechá-la incluem o seguinte:

  • Um item Sair no menu Arquivo, geralmente para janelas do aplicativo principal.
  • Um item Fechar no menu Arquivo, normalmente para uma janela do aplicativo secundária.
  • Um botão Cancelar, normalmente em uma caixa de diálogo modal.
  • Um botão Fechar, normalmente em uma caixa de diálogo não modal.

Importante

Depois que uma janela é fechada, a mesma instância de objeto não pode ser usada para reabrir a janela.

Para obter mais informações sobre a vida útil de uma janela, consulte Visão geral das janelas do WPF: tempo de vida da janela.

Fechar uma janela modal

Ao fechar uma janela que foi aberta com o ShowDialog método, defina a DialogResult propriedade como ou true false para indicar um estado "aceito" ou "cancelado", respectivamente. Assim que a DialogResult propriedade é definida como um valor, a janela é fechada. O código a seguir demonstra a configuração da DialogResult propriedade:

private void okButton_Click(object sender, RoutedEventArgs e) =>
    DialogResult = true;

private void cancelButton_Click(object sender, RoutedEventArgs e) =>
    DialogResult = false;
Private Sub okButton_Click(sender As Object, e As RoutedEventArgs)
    DialogResult = True
End Sub

Private Sub cancelButton_Click(sender As Object, e As RoutedEventArgs)
    DialogResult = False
End Sub

Você também pode chamar o Close método. Se o Close método for usado, a DialogResult propriedade será definida como false.

Depois que uma janela é fechada, ela não pode ser reaberta com a mesma instância de objeto. Se você tentar mostrar a mesma janela, um InvalidOperationException é lançado. Em vez disso, crie uma nova instância da janela e abra-a.

Fechar uma janela sem janela restrita

Ao fechar uma janela que foi aberta com o Show método, use o Close método. O código a seguir demonstra o fechamento de uma janela sem janela restrita:

private void closeButton_Click(object sender, RoutedEventArgs e) =>
    Close();
Private Sub closeButton_Click(sender As Object, e As RoutedEventArgs)
    Close()
End Sub

Fechar com IsCancel

A Button.IsCancel propriedade pode ser definida como true para permitir que a tecla ESC feche automaticamente a janela. Isso só funciona quando a janela é aberta com ShowDialog o método.

<Button Name="cancelButton" IsCancel="True">Cancel</Button>

Ocultar uma janela

Em vez de fechar uma janela, uma janela pode ser ocultada com o Hide método. Uma janela oculta pode ser reaberta, ao contrário de uma janela que foi fechada. Se você for reutilizar uma instância de objeto de janela, oculte a janela em vez de fechá-la. O código a seguir demonstra a ocultação de uma janela:

private void saveButton_Click(object sender, RoutedEventArgs e) =>
    Hide();
Private Sub saveButton_Click(sender As Object, e As RoutedEventArgs)
    Hide()
End Sub

Cancelar, fechar e ocultar

Se você projetou seus botões para ocultar uma janela em vez de fechá-la, o usuário ainda poderá ignorar isso e fechar a janela. O item Fechar do menu do sistema e o botão Fechar da área não cliente da janela fecharão a janela em vez de ocultá-la. Considere esse cenário quando sua intenção é ocultar uma janela em vez de fechá-la.

Cuidado

Se uma janela for mostrada modalmente com ShowDialog, a DialogResult propriedade será definida como null quando a janela estiver oculta. Você precisará comunicar o estado de volta ao código de chamada adicionando sua própria propriedade à janela.

Quando uma janela é fechada, o Closing evento é gerado. O manipulador recebe um CancelEventArgs, que implementa a Cancel propriedade. Defina essa propriedade como true para impedir que uma janela seja fechada. O código a seguir demonstra como cancelar o fechamento e, em vez disso, ocultar a janela:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    // Cancel the closure
    e.Cancel = true;

    // Hide the window
    Hide();
}
Private Sub Window_Closing(sender As Object, e As ComponentModel.CancelEventArgs)
    ' Cancel the closure
    e.Cancel = True

    ' Hide the window
    Hide()
End Sub

Pode haver momentos em que você não deseja ocultar uma janela, mas na verdade impede que o usuário a feche. Para obter mais informações, consulte Visão geral das janelas do WPF: cancelar o fechamento da janela.

Confira também