如何关闭窗口或对话框

在本文中,你将了解关闭窗口或对话框的不同方法。 用户可以使用非客户端区域中的元素关闭窗口,包括以下:

  • “系统”菜单的“关闭”项。
  • Alt + F4
  • “关闭 ”按钮。
  • 当一个按钮在模态窗口中设置IsCancel属性为true时,按下ESC

设计窗口时,向客户区域提供更多关闭窗口的机制。 用于关闭窗口的一些常见设计元素包括:

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

重要

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

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

关闭模式窗口

关闭使用 ShowDialog 该方法打开的窗口时,请将 DialogResult 该属性分别设置为“ true 已接受”或 false “已取消”状态。 属性设置为值后 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

还可以调用该方法 CloseClose如果使用该方法,则属性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 关闭

可以将该 Button.IsCancel 属性设置为 true 启用 ESC 键以自动关闭窗口。 这仅在使用 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 事件。 处理程序会接收一个CancelEventArgs,该CancelEventArgs实现了Cancel属性。 将此属性设置为 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 窗口概述:取消窗口关闭

另请参阅