PR

[C#][WPF]Enterキーを押して、フォーカスを移動させる方法

C#

私が開発に携わっているシステムを『使う』側の人たちは、入力の際にマウスを使わない人たちです。
左手に伝票、右手はテンキーというのがホームポジションです。

基本的にテンキーだけで入力したいので、フォーカスも Enter キーで移動するようにして欲しいとよく言われます。

というわけで、エンターキーでフォーカスが移動するようにしていきます。

キーボードキーダウンイベント

KeyDownイベントの中で次のように処理します。

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

        this.KeyDown += (s, e) =>
        {
            if (e.Key != Key.Enter)
            {
                // エンターキー以外は無視
                return;
            }

            // エンターキー押下でフォーカスを移動する
            // Shiftキーが押されているか確認
            var direction = Keyboard.Modifiers == ModifierKeys.Shift ? FocusNavigationDirection.Previous : FocusNavigationDirection.Next;
            // フォーカスを移動する
            FrameworkElement element = (FrameworkElement)FocusManager.GetFocusedElement(this);
            element.MoveFocus(new TraversalRequest(direction));
        };
    }
}

コード解説

まずは、押されたキーが “Enter”キーかどうか判定します。

次に、”Shift”キーが同時に押されているかどうかチェックします。
Shiftキーを押している場合には、逆順にフォーカスを移動させるためです。

あとは、現在のフォーカスがあるコントロールを取得し、MoveFocus メソッドでフォーカスを移動させます。

Enter キーを Tab キーに置き換える方法

別の方法として、Enter キーの入力を Tab キーに置き換えてしまう方法があります。

this.KeyDown += (sender, e) =>
{
    if (e.Key == Key.Enter)
    {
        KeyEventArgs e1 = new KeyEventArgs(e.KeyboardDevice, e.InputSource, e.Timestamp, Key.Tab)
        {
            RoutedEvent = Keyboard.KeyDownEvent
        };
        InputManager.Current.ProcessInput(e1);
    }
};

KeyDown イベントを使うのは変わりありません。

入力が Enter キーの場合、KeyEventArgs を新しく生成します。
InputManager に対して、新しいKeyDownイベントであるかのように ProcessInput() メソッドを呼び出してあげます。

注意

この方法では、KeyDown イベントが2回発生します。

コメント

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