web-dev-qa-db-ja.com

WPF Window.Close()がUserControl.Unloadedイベントをトリガーしない

カスタムUserControlを含むウィンドウがあります。 UserControlは、スレッドを終了できるように、それを含むウィンドウがいつ閉じられたかを知る必要があります。

これを達成する方法についての私の最良の推測は、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()。何か案は?

27
Stephen

この質問 の答えが判明し、私も問題を解決します。ただし、Unloadedイベントが発生しないのはまだ奇妙に思われます。図を行きます。

11
Stephen

MyWindowクラス内

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


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

        }
3

ハンドラーをwindow.Closedイベントに接続しないのはなぜですか? UserControlは、UIツリーをウォークスルーしてウィンドウを見つけることができます。

1
Ilya Khaprov