2009-09-30 284 views
26

我有一个包含自定义UserControl的窗口。 UserControl需要知道包含它的Window何时关闭,以便它可以终止线程。WPF Window.Close()不触发UserControl.Unloaded事件

对于如何完成此操作,我最好的猜测是处理UserControl的Unloaded事件。但是,Unloaded事件似乎只在用户实际点击关闭窗口时触发,而不是当我以编程方式在窗口上调用Close()方法时触发。

为了参考起见,下面是我的代码的一些相关部分。

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> 

MyControl.xaml.cs:

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

所以只是为了概括,所述UserControl_Unloaded()上述方法当我关闭窗口“手动”(alt-F4,点击红色的“X”等)时,调用会被调用,但是当从代码中的其他地方我打电话给myWindow.Close()。有任何想法吗?

回答

10

原来this question的答案也为我解决了这个问题。尽管如此,Unloaded事件还没有被解雇,这似乎仍然很奇怪。去搞清楚。

+4

从文档中:请注意,在应用程序开始关闭后,未加载Unloaded事件。当由ShutdownMode属性定义的条件发生时,会发生应用程序关闭。如果您将清理代码置于Unloaded事件的处理程序中,如Window或UserControl,则可能无法按预期调用它。 – 2010-11-18 22:24:28

1

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

+0

不是一个坏主意。然而,我在另一个SO问题中找到的解决方案似乎更清洁一点。不多,但有一点。 – Stephen 2009-09-30 19:53:28

+4

如果在关闭窗口之前删除UserControl会怎么样?资源泄漏! – 2009-11-12 15:14:43

3

在mywindow的类

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


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

     }