私が開発に携わっているシステムを『使う』側の人たちは、入力の際にマウスを使わない人たちです。
左手に伝票、右手はテンキーというのがホームポジションです。
基本的にテンキーだけで入力したいので、フォーカスも 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回発生します。
コメント