WPF で Enter キーを押したらフォーカス移動するようにする

WPF で Enter キーでのフォーカス移動するコードです。
21世紀の現代も、要件として存在するそうです。

1.
KeyDown イベントの中で、次の処理を行います。

2.
押されたキーが Enter であるかを判定します。
Shift キーが押されていた場合は逆順に移動するために、Shift キーが押されているかも判定します。
Shift キーの判定は Keyboard クラスの Modifiers プロパティで行います。

3.
FocusManager クラスの GetFocusedElement メソッドでフォーカスを持っている要素を取得します。
WnForms での Form の ActiveControl プロパティに相当します。

4.
続いて上記で取得した要素の MoveFocus メソッドでフォーカスを移動します。
WinForms での Control の SelectNextControl メソッドに相当します。
WinForms 時代には、その他にも SendKey メソッドで Tab キー押下を送る実装もあったと聞いたこともあります。

5.
特定のコントロールでは状態に応じては、Enter でフォーカス移動したくないという場合は次のようにします。
該当コントロールの KeyDown イベントの中で、コントロールの状態を判定します。
判定の結果、フォーカスを移動したくない場合、イベント引数の Handled プロパティに true をセットします。

■ コード
上記 5. の例として、ここでは textBox という TextBox のコントロールが存在し、このコントロールでは入力がある場合のみフォーカスを移動するという処理をいれています。

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();

        // Enter キーでフォーカス移動する
        this.KeyDown += (sender, e) =>
        {
            if (e.Key != Key.Enter) { return; }
            var direction = Keyboard.Modifiers == ModifierKeys.Shift ? FocusNavigationDirection.Previous : FocusNavigationDirection.Next;
            (FocusManager.GetFocusedElement(this) as FrameworkElement)?.MoveFocus(new TraversalRequest(direction));
        };

        // textBox という TextBox では何も入力されていない場合は、フォーカス移動しない
        this.textBox.KeyDown += (sender, e) =>
        {
            if (e.Key != Key.Enter) { return; }
            if (!string.IsNullOrEmpty(((TextBox)sender).Text)) { return; }
            e.Handled = true;   // Hanbled を true にすると Window の KeyDown イベントは発生しない
        };
    }
}
広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

w

%s と連携中