ウィンドウまたはダイアログ ボックスを閉じる方法 (WPF .NET)

この記事では、ウィンドウまたはダイアログ ボックスを閉じるさまざまな方法について説明します。 ユーザーは、次のような非クライアント領域の要素を使用してウィンドウを閉じることができます。

  • [システム] メニューの [閉じる] 項目。
  • Alt + F4 キーを押す。
  • [閉じる] ボタンを押す。
  • モーダル ウィンドウで、ボタンの IsCancel プロパティが true に設定されている場合に ESC キーを押す。

ウィンドウをデザインする場合は、ウィンドウを閉じるための多くのしくみをクライアント領域に提供します。 ウィンドウを閉じるために使用されるウィンドウ上の一般的なデザイン要素には、次のものがあります。

  • 一般にメイン アプリケーション ウィンドウにある、 [ファイル] メニューの [終了] 項目。
  • 一般にアプリケーションの 2 次ウィンドウにある、 [ファイル] メニューの [閉じる] 項目。
  • 一般にモーダル ダイアログ ボックスにある [キャンセル] ボタン。
  • 一般にモードレス ダイアログ ボックスにある [閉じる] ボタン。

重要

ウィンドウが閉じられると、同じオブジェクト インスタンスを使用してそのウィンドウ再度開くことはできません。

ウィンドウの有効期間の詳細については、「WPF ウィンドウの概要: ウィンドウの有効期間」を参照してください。

モーダル ウィンドウを閉じる

ShowDialog メソッドを使って開いたウィンドウを閉じる場合は、DialogResult プロパティを true または false に設定して、それぞれ"承諾" または "キャンセル" の状態を示します。 DialogResult プロパティが値に設定されるとすぐに、ウィンドウが閉じます。 次のコードは、DialogResult プロパティを設定する方法を示しています。

private void okButton_Click(object sender, RoutedEventArgs e) =>
    DialogResult = true;

private void cancelButton_Click(object sender, RoutedEventArgs e) =>
    DialogResult = false;
Private Sub okButton_Click(sender As Object, e As RoutedEventArgs)
    DialogResult = True
End Sub

Private Sub cancelButton_Click(sender As Object, e As RoutedEventArgs)
    DialogResult = False
End Sub

Close メソッドを呼び出すこともできます。 Close メソッドを使用すると、DialogResult プロパティが false に設定されます。

ウィンドウが閉じられると、同じオブジェクト インスタンスを使用して再度開くことはできません。 同じウィンドウを表示しようとすると、InvalidOperationException がスローされます。 代わりに、ウィンドウの新しいインスタンスを作成して開きます。

モードレス ウィンドウを閉じる

Show メソッドを使って開いたウィンドウを閉じる場合は、Close メソッドを使用します。 次のコードは、モードレス ウィンドウを閉じる方法を示しています。

private void closeButton_Click(object sender, RoutedEventArgs e) =>
    Close();
Private Sub closeButton_Click(sender As Object, e As RoutedEventArgs)
    Close()
End Sub

IsCancel を使って閉じる

Button.IsCancel プロパティを true に設定すると、ESC キーを使用してウィンドウを自動的に閉じることができます。 これは、ShowDialog メソッドを使ってウィンドウを開いている場合にのみ機能します。

<Button Name="cancelButton" IsCancel="True">Cancel</Button>

ウィンドウを非表示にする

ウィンドウを閉じる代わりに、Hide メソッドを使ってウィンドウを非表示にできます。 閉じられたウィンドウとは異なり、非表示のウィンドウは再度開くことができます。 ウィンドウ オブジェクト インスタンスを再利用する予定がある場合は、ウィンドウを閉じるのではなく、非表示にします。 次のコードは、ウィンドウを非表示にする方法を示しています。

private void saveButton_Click(object sender, RoutedEventArgs e) =>
    Hide();
Private Sub saveButton_Click(sender As Object, e As RoutedEventArgs)
    Hide()
End Sub

閉じると非表示のキャンセル

ウィンドウを閉じるのではなく、非表示にするようにボタンをデザインした場合でも、ユーザーがこれをバイパスしてウィンドウを閉じることができます。 システム メニューの [閉じる] 項目とウィンドウの非クライアント領域の [閉じる] ボタンを使うと、ウィンドウは、非表示ではなく閉じられます。 このシナリオは、ウィンドウを閉じるのではなく、非表示にすることが目的の場合に検討してください。

注意事項

ウィンドウが ShowDialog を使ってモーダル表示されている場合、ウィンドウが非表示になるときに DialogResult プロパティが null に設定されます。 独自のプロパティをウィンドウに追加して、呼び出し元のコードに状態を通知する必要があります。

ウィンドウが閉じられると、Closing イベントが発生します。 ハンドラーには CancelEventArgs が渡され、これにより、Cancel プロパティが実装されます。 そのプロパティを true に設定して、ウィンドウが閉じないようにします。 次のコードは、クロージャをキャンセルし、代わりにウィンドウを非表示にする方法を示しています。

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    // Cancel the closure
    e.Cancel = true;

    // Hide the window
    Hide();
}
Private Sub Window_Closing(sender As Object, e As ComponentModel.CancelEventArgs)
    ' Cancel the closure
    e.Cancel = True

    ' Hide the window
    Hide()
End Sub

ウィンドウを非表示にしたいのではなく、ユーザーがウィンドウを閉じられないようにしたい場合があります。 詳細については、「WPF ウィンドウの概要: ウィンドウ クロージャのキャンセル」を参照してください。

関連項目