如何关闭窗口或对话框 (WPF .NET)

在本文中,你将了解关闭窗口或对话框的不同方法。 用户可使用非工作区中的元素关闭窗口,这些元素包括:

  • “系统”菜单的“关闭”项。
  • ALT+F4
  • 按“关闭”按钮。
  • 在模式窗口上,当按钮的 IsCancel 属性设置为 true 时,按 ESC

设计窗口时,为工作区提供了更多用于关闭窗口的机制。 窗口中用于关闭该窗口的一些常见设计元素包括:

  • “文件”菜单中的“退出”项,通常用于主应用程序窗口。
  • “文件”菜单中的“关闭”项,通常位于辅助应用程序窗口中。
  • “取消”按钮,通常位于模式对话框中。
  • “关闭”按钮,通常位于非模式对话框中。

重要

关闭某个窗口后,不能使用同一对象实例重新打开该窗口。

有关窗口生命周期的详细信息,请参阅 WPF 窗口概述:窗口生命周期

关闭模式窗口

当关闭使用 ShowDialog 方法打开的窗口时,需将 DialogResult 属性设置为 truefalse,以分别指示“已接受”或“已取消”状态。 如果将 DialogResult 属性设置为某个值,窗口将关闭。 下面的代码演示如何设置 DialogResult 属性:

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

也可以调用 Close 方法。 如果使用了 Close 方法,则将 DialogResult 属性设置为 false

关闭某个窗口后,就不能用同一对象实例将其重新打开。 如果尝试显示同一窗口,则会引发 InvalidOperationException。 请改为创建新的窗口实例并将其打开。

关闭非模式窗口

当关闭使用 Show 方法打开的窗口时,请使用 Close 方法。 以下代码演示如何关闭非模式窗口:

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

用 IsCancel 关闭

若要启用 ESC 键以自动关闭窗口,可以将 Button.IsCancel 属性设置为 true。 这仅在使用 ShowDialog 方法打开窗口时有效。

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

隐藏窗口

可使用 Hide 方法隐藏窗口,而不是关闭窗口。 与已关闭的窗口不同,可以重新打开隐藏的窗口。 如果要重用窗口对象实例,请隐藏窗口,而不是将其关闭。 以下代码演示如何隐藏窗口:

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

取消关闭并隐藏

如果将按钮设计为隐藏而不是关闭窗口,用户仍可绕过该按钮并关闭窗口。 系统菜单的“关闭”项和窗口非工作区的“关闭”按钮将关闭窗口,而不是隐藏窗口。 假设以下场景:你的意图是隐藏窗口而不是将其关闭。

注意

如果使用 ShowDialog 以模态方式显示窗口,则在隐藏窗口时 DialogResult 属性将设置为 null。 需要通过将自己的属性添加到窗口来将状态返回给调用代码。

当窗口关闭时,将引发 Closing 事件。 将处理程序传递给实现 Cancel 属性的 CancelEventArgs。 若要防止窗口关闭,请将该属性设置为 true。 以下代码演示如何取消关闭并隐藏窗口:

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

有时,你可能不想隐藏某个窗口,但实际上会阻止用户关闭该窗口。 有关详细信息,请参阅 WPF 窗口概述:取消关闭窗口

另请参阅