DOBON.NET DOBON.NETプログラミング掲示板過去ログ

WPFでtextBoxのLostFocusでFocus()すると無限ループ?

環境/言語:[Windows 7/Vista MS2010 C# WPF Winアプリ]
分類:[.NET]

お世話になります。

WPFで教えてください。テキストボックスに入力した文字数などが正しくない時、再入力を促すために同じテキストボックスにフォーカスを当てて文字を選択状態にしたいのですが、下記のようにすると無限ループに陥ります。

どのようにコードを書くべきでしょうか?教えてください。

private void textBox4_LostFocus(object sender, RoutedEventArgs e)
{
if (textBox4.Text.Length != 4)
{
MessageBox.Show("受付番号が、4ケタではありません。");
textBox4.SelectAll();
textBox4.Focus();
return;
}

:
:
■No32224に返信(hiroさんの記事)
> WPFで教えてください。
> テキストボックスに入力した文字数などが正しくない時、
> 再入力を促すために同じテキストボックスにフォーカスを当てて文字を選択状態にしたいのですが、
> 下記のようにすると無限ループに陥ります。

メッセージボックスを出した時にもLostFocusイベントが発生するからでしょう。
別のイベントでやる必要があると思います。


> どのようにコードを書くべきでしょうか?教えてください。

LostFocusではなくPreviewLostKeyboardFocusでやるとできそうです。
また合わせて元のコントロールにフォーカスを再設定するのではなく、
フォーカスの移動をe.Handled = true;にてキャンセルすれば良いようです。


private void textBox4_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    if (textBox4.Text.Length != 4)
    {
        MessageBox.Show("受付番号が、4ケタではありません。");
        textBox4.SelectAll();
        //textBox4.Focus();
        e.Handled = true;
        return;
    }
}

当方、WPFでの開発はなく、試し遊び程度なスキルなのでもっと良い方法があるかもしれません。
「Focus」のつくイベントを一通り試してみることをお勧めします。

というより、LostFocus&Focus設定の処理は何かと面倒な事になりかねないので、
根本的にはお勧めしませんが・・・。
http://social.msdn.microsoft.com/Forums/ja-JP/86b8326f-58cd-414d-a25c-f9e002f79f65
この辺でも指摘されています。


# MS2010?VS2010のこと?
anさん、お世話になります。


> LostFocusではなくPreviewLostKeyboardFocusでやるとできそうです。
> フォーカスの移動をe.Handled = true;にてキャンセルすれば良いようです。
>
これでうまく行きました。ありがとうございます。

>
> # MS2010?VS2010のこと?

その通りです!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板