How to close a window or dialog box (WPF .NET)

In this article, you'll learn about the different ways to close a window or dialog box. A user can close a window by using the elements in the non-client area, including the following:

  • The Close item of the System menu.
  • Pressing ALT + F4.
  • Pressing the Close button.
  • Pressing ESC when a button has the IsCancel property set to true on a modal window.

When designing a window, provide more mechanisms to the client area to close a window. Some of the common design elements on a window that are used to close it include the following:

  • An Exit item in the File menu, typically for main application windows.
  • A Close item in the File menu, typically on a secondary application window.
  • A Cancel button, typically on a modal dialog box.
  • A Close button, typically on a modeless dialog box.

Important

Once a window is closed, the same object instance can't be used to reopen the window.

For more information about the life of a window, see Overview of WPF windows: Window lifetime.

Close a modal window

When closing a window that was opened with the ShowDialog method, set the DialogResult property to either true or false to indicate an "accepted" or "canceled" state, respectively. As soon as the DialogResult property is set to a value, the window closes. The following code demonstrates setting the DialogResult property:

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

You can also call the Close method. If the Close method is used, the DialogResult property is set to false.

Once a window has been closed, it can't be reopened with the same object instance. If you try to show the same window, a InvalidOperationException is thrown. Instead, create a new instance of the window and open it.

Close a modeless window

When closing a window that was opened with the Show method, use the Close method. The following code demonstrates closing a modeless window:

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

Close with IsCancel

The Button.IsCancel property can be set to true to enable the ESC key to automatically close the window. This only works when the window is opened with ShowDialog method.

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

Hide a window

Instead of closing a window, a window can be hidden with the Hide method. A hidden window can be reopened, unlike a window that has been closed. If you're going to reuse a window object instance, hide the window instead of closing it. The following code demonstrates hiding a window:

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

Cancel close and hide

If you've designed your buttons to hide a window instead of closing it, the user can still bypass this and close the window. The Close item of the system menu and the Close button of the non-client area of the window, will close the window instead of hiding it. Consider this scenario when your intent is to hide a window instead of closing it.

Caution

If a window is shown modally with ShowDialog, the DialogResult property will be set to null when the window is hidden. You'll need to communicate state back to the calling code by adding your own property to the window.

When a window is closed, the Closing event is raised. The handler is passed a CancelEventArgs, which implements the Cancel property. Set that property to true to prevent a window from closing. The following code demonstrates how to cancel the closure and instead hide the window:

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

There may be times where you don't want to hide a window, but actually prevent the user from closing it. For more information, see Overview of WPF windows: Cancel window closure.

See also