为什么窗口的卸载事件不会在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)。