none
WPF Me.Close()でWindowが閉じない RRS feed

  • 質問

  • WPFで下のコードですが、Me.Close()実行後に下の行が実行され、困っています。
    回避方法を教えて下さい。お願い致します。

        Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded

            MessageBox.Show("test")
            Me.Close()
            MessageBox.Show("閉じていない")
            Stop

        End Sub

    2020年2月7日 7:18

回答

  • ご提示のプログラムに限れば、「プロセスが終了するタイミングはMainWindow_Loaded()が終了した時」のご理解が一番近いと思います。どのような動作を期待されているのか、その期待に基づいて何をプログラムされようとしているのかわかりませんが・・・、

    Me.Close()は、MeをCloseする動作を予約するメソッド、という理解の方が良いと思います。Close()メソッドの中でプロセスが終了するこはないです。

    MeというFormが完全に閉じられるまでに、Closingというイベントが発生し、このイベントを利用して「やっぱりCloseしないことにした」という処理も可能です。Closedというイベントもありさらに処理を行うことも可能です。これらのイベント処理のなかで、それぞれMessageBoxを表示させることもできます。特に、Closingイベントにおいて「閉じようとしているけど、本当にいいのか?」と尋ねるMessageBoxを出すことは、よくある手法です。

    これらのイベントに対する処理をご提示のプログラムに追記した場合、Loadedイベントの処理(ご提示のプログラム)を抜けたあと、Closingイベント、Closedイベントと順に発生します。




    • 編集済み 外池 2020年2月7日 8:39
    • 回答としてマーク huahi11112 2020年2月10日 2:33
    2020年2月7日 8:35

すべての返信

  • "閉じていない" のMessageBoxの表示中には、プロセスにこのアプリケーションが残っています。

    プロセスが終了するタイミングはMainWindow_Loaded()が終了した時なのでしょうか。

    2020年2月7日 7:39
  • ご提示のプログラムに限れば、「プロセスが終了するタイミングはMainWindow_Loaded()が終了した時」のご理解が一番近いと思います。どのような動作を期待されているのか、その期待に基づいて何をプログラムされようとしているのかわかりませんが・・・、

    Me.Close()は、MeをCloseする動作を予約するメソッド、という理解の方が良いと思います。Close()メソッドの中でプロセスが終了するこはないです。

    MeというFormが完全に閉じられるまでに、Closingというイベントが発生し、このイベントを利用して「やっぱりCloseしないことにした」という処理も可能です。Closedというイベントもありさらに処理を行うことも可能です。これらのイベント処理のなかで、それぞれMessageBoxを表示させることもできます。特に、Closingイベントにおいて「閉じようとしているけど、本当にいいのか?」と尋ねるMessageBoxを出すことは、よくある手法です。

    これらのイベントに対する処理をご提示のプログラムに追記した場合、Loadedイベントの処理(ご提示のプログラム)を抜けたあと、Closingイベント、Closedイベントと順に発生します。




    • 編集済み 外池 2020年2月7日 8:39
    • 回答としてマーク huahi11112 2020年2月10日 2:33
    2020年2月7日 8:35
  • 外池さま、御回答ありがとうございました。

    「プロセスが終了するタイミングはMainWindow_Loaded()が終了した時」 と認識させていただきます。

     Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
            Me.Close()
            MessageBox.Show("閉じていない")
        End Sub

    上の様にしてもMessageBox.Showは実行されました。

    Me.Close()は、MeをCloseする動作の予約であり、その後のコードは実行され、実際のCloseの動作はメソッドを抜けた後に実行されるということが分かりました。

    2020年2月10日 2:43