WPF窗口关闭(Window.Close())未触发UserControl.Unloaded事件

29

我有一个包含自定义UserControl的窗口。 UserControl需要知道包含它的Window何时被关闭,以便它可以终止线程。

我认为最好的方法是处理UserControl的Unloaded事件。然而,当我在程序中调用Close()方法关闭窗口时,Unloaded事件似乎只会在用户实际点击关闭窗口时触发,而不会自动触发。

以下是我的代码中相关部分的参考。

MyWindow.xaml:

<Window x:Class="Namespace.MyWindow"
        xmlns:controls="clr-namespace:Namespace.Controls">
    <controls:MyControl/>
</Window>

MyControl.xaml:

<UserControl x:Class="Namespace.Controls.MyControl"
             Unloaded="UserControl_Unloaded"/>
    <!-- Stuff -->
</UserControl>

我的控件.xaml.cs:

void UserControl_Unloaded(object sender, RoutedEventArgs e)
{
    // Stop the thread.
}

所以简单概括一下,上面的UserControl_Unloaded()方法会在我“手动”关闭窗口(alt-F4、点击红色“X”等)时被调用,但是当我从代码中其他地方调用myWindow.Close()时却没有被调用。有什么想法吗?

3个回答

13

结果发现这个问题的答案也解决了我的问题。虽然未被触发的 Unloaded 事件仍然让人感到奇怪,但是问题得到了解决。


6
从文档中可以得知:请注意,当应用程序开始关闭时,不会引发“Unloaded”事件。应用程序的关闭是在“ShutdownMode”属性定义的条件发生时发生的。如果您将清理代码放在“Unloaded”事件的处理程序中(例如Window或UserControl),则可能无法按预期调用该处理程序。 - Mike Post

2

在 MyWindow 类中

this.Closing += new System.ComponentModel.CancelEventHandler(Window1_Closing);


void Window1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            call User Control Method()

        }

1
为什么不将处理程序连接到window.Closed事件呢?您的UserControl可以遍历UI树以查找窗口。

不是一个坏主意。然而,我在另一个SO问题中找到的解决方案似乎更简洁一些。虽然差别不大,但确实有所改善。 - Stephen
4
如果在窗口关闭之前移除了UserControl,就会出现资源泄漏!请注意清理。 - Robert Jeppesen
我在另一个SO问题中找到的解决方案似乎更加简洁。虽然不是很明显,但确实有所改善。 - Ryan Leach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接