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

Hot*_*ter 9 c# wpf

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

MyWindow obj = new MyWindow(); 
obj.ShowDialog();
obj.Close();
Run Code Online (Sandbox Code Playgroud)

Har*_*san 12

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

请改用它

   yourWindow.Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;

   private void Dispatcher_ShutdownStarted( object sender, EventArgs e )
   {
       //do what you want to do on closing
   }
Run Code Online (Sandbox Code Playgroud)

阅读本文了解更多详情

编辑

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

yourWindow.Closing += new CancelEventHandler(YourWindow_Closing);

void YourWindow_Closing(object sender, CancelEventArgs e)
{

}
Run Code Online (Sandbox Code Playgroud)


AAA*_*ddd 7

如果您真的想确认关闭,我认为最好了解窗口的生命周期及其引发的相关事件。

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

闭幕式

当窗口关闭时,它会引发两个事件:ClosingClosed

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

此外

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

如果 Closing 没有被处理,或者它被处理但没有被取消,窗口将关闭。就在窗口实际关闭之前, Closed 被提升。此时,无法阻止窗口关闭。

笔记

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

  • 用户注销或关闭 Windows。

  • 一个窗口的所有者关闭。

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

  • 关机被调用。

所有窗口生命周期事件

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

在此处输入图片说明

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

在此处输入图片说明