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
.NET Desktop feedback