WPFフォームでウィンドウ閉じるボタン(ウィンドウ右上の赤いXボタン)のイベントをキャッチするにはどうすればよいですか?クロージングイベント、ウィンドウアンロードイベントもありますが、WPFフォームの閉じるボタンをクリックするとポップアップが表示されます。
ウィンドウでClosing
イベントを使用すると、次のように処理して、閉じることを防ぐことができます。
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
e.Cancel = true;
}
form2の確認ボタンが押された場合はアクションを実行し、Xボタンが押された場合は何も実行しません。
public class Form2
{
public bool confirm { get; set; }
public Form2()
{
confirm = false;
InitializeComponent();
}
private void Confirm_Button_Click(object sender, RoutedEventArgs e)
{
//your code
confirm = true;
this.Close();
}
}
最初の形式:
public void Form2_Closing(object sender, CancelEventArgs e)
{
if(Form2.confirm == false) return;
//your code
}
at form1.Designer.csイベントを割り当てるコードの下に配置
this.Closing += Window_Closing;
at form1.csクロージング関数を配置
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
//change the event to avoid close form
e.Cancel = true;
}
解決策:
フラグを持っている Close()メソッドがXアイコンボタン以外から呼び出されているかどうかを識別します。 (例:IsNonCloseButtonClicked;)
Closing() IsNonCloseButtonClickedがfalseであるかどうかを確認するイベントメソッド内に条件文を設定します。
Falseの場合、アプリはXアイコンボタン以外で自分自身を閉じようとしています。 trueの場合、このアプリを閉じるためにXアイコンボタンがクリックされたことを意味します。
[サンプルコード]
private void buttonCloseTheApp_Click (object sender, RoutedEventArgs e) {
IsNonCloseButtonClicked = true;
this.Close (); // this will trigger the Closing () event method
}
private void MainWindow_Closing (object sender, System.ComponentModel.CancelEventArgs e) {
if (IsNonCloseButtonClicked) {
e.Cancel = !IsValidated ();
// Non X button clicked - statements
if (e.Cancel) {
IsNonCloseButtonClicked = false; // reset the flag
return;
}
} else {
// X button clicked - statements
}
}
VB.NETの場合:
Private Sub frmMain_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
' finalize the class
End Sub
フォームXボタンを無効にするには:
'=====================================================
' Disable the X button on the control bar
'=====================================================
Private Const CP_NOCLOSE_BUTTON As Integer = &H200
Protected Overloads Overrides ReadOnly Property CreateParams() As CreateParams
Get
Dim myCp As CreateParams = MyBase.CreateParams
myCp.ClassStyle = myCp.ClassStyle Or CP_NOCLOSE_BUTTON
Return myCp
End Get
End Property