Window.Closing 事件

定义

在调用 Close() 之后立即发生,并且可进行处理以取消关闭窗口。

public event System.ComponentModel.CancelEventHandler Closing;

事件类型

例外

当窗口正在关闭时,将设置 Visibility,或者调用 Show()ShowDialog()Close()

示例

以下示例演示了一个 Window ,它确定是否需要用户干预才能关闭。

<Window 
  x:Class="CSharp.DataWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Closing="DataWindow_Closing"  
    >
  <Grid>
    <TextBox Name="documentTextBox" AcceptsReturn="True" AcceptsTab="True" TextChanged="documentTextBox_TextChanged"></TextBox>
  </Grid>
</Window>
using System; // EventArgs
using System.ComponentModel; // CancelEventArgs
using System.Windows; // window

namespace CSharp
{
    public partial class DataWindow : Window
    {
        // Is data dirty
        bool isDataDirty = false;

        public DataWindow()
        {
            InitializeComponent();
        }

        void documentTextBox_TextChanged(object sender, EventArgs e)
        {
            this.isDataDirty = true;
        }

        void DataWindow_Closing(object sender, CancelEventArgs e)
        {
            MessageBox.Show("Closing called");

            // If data is dirty, notify user and ask for a response
            if (this.isDataDirty)
            {
                string msg = "Data is dirty. Close without saving?";
                MessageBoxResult result = 
                  MessageBox.Show(
                    msg, 
                    "Data App", 
                    MessageBoxButton.YesNo, 
                    MessageBoxImage.Warning);
                if (result == MessageBoxResult.No)
                {
                    // If user doesn't want to close, cancel closure
                    e.Cancel = true;
                }
            }
        }
    }
}

注解

Closing 可以处理 以检测窗口何时关闭 (例如,何时 Close) 调用 。 此外, Closing 可用于防止窗口关闭。 若要防止窗口关闭,可以将 参数的 CancelEventArgs 属性设置为 。Canceltrue

Closing调用 时Close、单击窗口的“关闭”按钮或用户按 Alt+F4 时,将引发 该事件。

如果拥有的窗口由其所有者窗口使用 Show打开,并且所有者窗口已关闭,则不会引发拥有窗口的 Closing 事件。 如果关闭窗口的所有者 (看到 Owner) , Closing 则 不会在拥有的窗口上引发 。

如果 Shutdown 调用 ,则会 Closing 引发每个窗口的 事件。 但是,如果 Closing 已取消,则忽略取消。

如果会话因用户注销或关闭而结束, Closing 则 不会引发 ;句柄 SessionEnding 来实现取消应用程序关闭的代码。

如果要在应用程序的生存期内多次显示和隐藏窗口,并且不希望每次显示窗口时都重新实例化该窗口,可以处理 Closing 事件、取消该事件并调用 Hide 方法。 然后,可以在同一实例上调用 Show 以重新打开它。

适用于

产品 版本
.NET Framework 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
Windows Desktop 3.0, 3.1, 5, 6, 7, 8, 9

另请参阅