如何关闭窗口或对话框 (WPF .NET)
在本文中,你将了解关闭窗口或对话框的不同方法。 用户可使用非工作区中的元素关闭窗口,这些元素包括:
- “系统”菜单的“关闭”项。
- 按 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
也可以调用 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 窗口概述:取消关闭窗口。