2009-09-30 286 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() 

     }