マウスレスアプリケーションでよくある、Enterキーを押したら次のコントロールにフォーカスを移すってやつですね。このおもてなしを味わってしまうと、人類はマウスレスが好きになってしまう。

マウスレスというか、テンキーに最適化したUI。販売管理や在庫管理のアプリケーションって、太古の昔からあるんですよね。ホスト機のようにCUIに毛が生えたようなGUIで、デスクトップがメインでかつ数字の計算を行う処理が多かった時代からある。なので、必然的にテンキーから手を動かさないで良いUIが多かったと思います。

結論から言うと、こうなります。


private void Application_Startup(object sender, StartupEventArgs e)
{
    EventManager.RegisterClassHandler(typeof(TextBox),
        TextBox.KeyDownEvent, new KeyEventHandler(UIElement_MoveNext));
}
void UIElement_MoveNext(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        MoveToNextUIElement(e);
    }
}
void MoveToNextUIElement(KeyEventArgs e)
{
    FocusNavigationDirection focusDirection = FocusNavigationDirection.Next;
    TraversalRequest request = new TraversalRequest(focusDirection);
    UIElement elementWithFocus = Keyboard.FocusedElement as UIElement;
    if (elementWithFocus != null) elementWithFocus.MoveFocus(request);
}

以上です。

App.xamlのイベントハンドラに、イベントジャーマネでTextBoxのKeyDownEventに対し、イベントハンドラーを登録します。イベントハンドラの引数はデリゲートです。関数を代入できる。

MoveToNextUIElementはもうそのまま。次のフォーカスに家というリクエストを、キーボードでフォーカスがあたっている要素に対して発火する。

小ネタですけど、テキストボックス1個1個にイベントハンドラ書いてたら悲劇だなーと思ったので、書いておきます。