为什么窗口的卸载事件不会在WPF中触发?

在我的WPF应用程序中,我创建了一个窗口,并通过ShowDialog()方法调用它来显示它。 但是当我通过Close()方法关闭窗口时,不会为此对话框窗口触发Unloaded事件。

MyWindow obj = new MyWindow(); obj.ShowDialog(); obj.Close(); 

这是一个众所周知的问题。

改用它

  yourWindow.Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted; private void Dispatcher_ShutdownStarted( object sender, EventArgs e ) { //do what you want to do on closing } 

阅读本文了解更多详情

编辑

如果上面没有工作试试这个

 yourWindow.Closing += new CancelEventHandler(YourWindow_Closing); void YourWindow_Closing(object sender, CancelEventArgs e) { } 

如果你真的想得到关闭的确认,我认为最好了解一个窗口的生命周期以及它引发的相关事件。

然而,在我看来,最好的确认来源是Closed活动。 其他框架方式可能不可靠

结束活动

当窗口关闭时,它会引发两个事件: Closing和Closed 。

在窗口关闭之前关闭,它提供了一种可以防止窗户关闭的机制。 阻止窗口关闭的一个常见原因是窗口内容是否包含已修改的数据。 在这种情况下,可以处理Closing事件以确定数据是否是脏的,如果是,则询问用户是否继续关闭窗口而不保存数据或取消窗口关闭。 以下示例显示了处理Closing的关键方面。

更多

Closing事件处理程序传递一个CancelEventArgs,它实现您设置为true的BooleanCancel属性以防止窗口关闭。 +

如果未处理Closing,或者处理但未取消,则窗口将关闭。 就在窗口实际关闭之前,已经关闭了。 此时,无法阻止窗口关闭。

注意

虽然可以通过非客户端和客户端区域中提供的机制显式关闭窗口,但是由于应用程序或Windows的其他部分中的行为,窗口也可以隐式关闭,包括以下内容:

  • 用户注销或关闭Windows。

  • 窗户的主人关闭。

  • 主应用程序窗口关闭,ShutdownMode为OnMainWindowClose。

  • 关机被叫。

所有窗口终身事件

下图显示了窗口生命周期中主要事件的顺序。

在此处输入图像描述

下图显示了未激活时显示的窗口生命周期中的主要事件的顺序(在显示窗口之前将ShowActivated设置为false)。

在此处输入图像描述