C#(WPF) KeyDownイベントで画面を「閉じる」だけだと動作が上手くいかな場合の対処法!

C#

WPFの画面に、「閉じる」ボタンを作成して、KeyDownイベントによりClose()によって、ウィンドウを閉じるために実装を行っていたのですが、ただCloseで閉じるだけでは動作が安定していなかった際の対処法です。

今回の問題

画面にTextBoxがある場合に、TextBoxを選択中に「閉じる」ボタンを押した際に、

LostFocusイベントがあるためフォーカスが外れた時点でLostFocusイベントがはしってしまい少し意図しない挙動となってしまいました。

その対策と対策時の注意点をちょっとメモしておきます

処理内容

LostFocusイベント追加

○まずはXmalでイベントを付けるのではなくLoadイベントでLostFocusを追加(ここはどちらでも良いですが)

//ロードイベント
private void Main_Load(object sender, System.EventArgs e)
{
    //TextBox1のLostFocusイベントハンドラを追加する
    TextBox1.LostFocus += TextBox1_LostFocus;  
}

LostFocusイベントに処理追加

LostFocusイベントには行いたい処理を追加します。今回の本題とは関係ないのでとくに処理に内容は記載していないです。

//LostFocusイベントハンドラ
private void TextBox1_LostFocus(object sender, EventArgs e)
{
    //ここでいろいろチェック処理
}

「閉じる」ボタンのクリックイベントでLostFocusを破棄!

ここでtextBoxのロストフォーカスイベントを破棄しておきます。
PreviewKeyDownでこの処理を行うと、フォーカスが移る前に発生するイベントなのでLostFocusの前に破棄することができました。

private void Button1_PreviewKeyDown(object sender, KeyEventArgs e) {
    //TextBox1のLostFocusイベントハンドラを破棄する
    TextBox1.LostFocus -= TextBox1_LostFocus;
}

※ここで注意点なのですが、このままだと

「閉じる」ボタンをクリック → そのままドラッグ

とした動作場合に閉じない(閉じるのはKeyUpにしていたとき)事象が発生します。そしてLostFocusがなくなってしまっていました。

LostFocusの追加タイミング

そのため、「閉じる」ボタンのキーアップイベントでイベントを再度追加させてあげることで、問題は解決しました。

private void Button1_PreviewKeyUp(object sender, KeyEventArgs e) {
    //TextBox1のLostFocusイベントハンドラを追加する
    TextBox1.LostFocus += TextBox1_LostFocus;
}

これで「閉じる」ボタンをクリック→やっぱり「閉じる」をやめたいので「閉じる」ボタンからフォーカスをはずしてクリックアップしたいとする期待通りの動作になりました。

コメント

タイトルとURLをコピーしました