2009-09-30 91 views
26

私はカスタムUserControlを含むウィンドウを持っています。 UserControlは、スレッドを終了できるように、それを含むウィンドウが閉じられたときを知る必要があります。WPF Window.Close()は、UserControl.Unloadedイベントをトリガーしません。

これを達成する方法について私が推測したのは、UserControlの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イベントが起きていないというのはまだ奇妙に思えます。 Go figure。

+4

ドキュメントから:アプリケーションのシャットダウンが開始された後、Unloadedイベントが発生しないことに注意してください。 ShutdownModeプロパティで定義された条件が発生すると、アプリケーションのシャットダウンが発生します。 Unloadedイベントのハンドラ内に、ウィンドウやUserControlなどのクリーンアップコードを配置すると、期待どおりに呼び出されないことがあります。 –

1

なぜ、ハンドラをwindow.Closedイベントに接続しないのですか?あなたのUserControlはウィンドウを見つけるためにuiツリーを歩くことができます。

+0

悪くないアイデア。私は別のSOの質問で見つけた解決策は、少し清潔に思われる。それほど多くはありませんが、少しです。 – Stephen

+4

ウィンドウが閉じられる前にUserControlが削除されるとどうなりますか?リソースリーク! –

3
mywindowのクラスで

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


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

     } 
関連する問題