正如标题中所述,我们试图拦截一个键并用另一个键替换它。类似于键映射
我们的具体用法是改变左方向键和右方向键的行为,分别像Shift-Tab和Tab。
现在我知道我可以拦截这些并手动控制焦点,但我正在尝试尽可能多地利用内置导航行为。我们只是想(也)使用箭头键来实现这种行为。
我唯一能想到的是吞下事件,然后用正确的参数重新抛出它,但我担心这会干扰像键释放,重复等。
如果这实际上是不可能的,我也愿意采用其他方法。同样,我们的目标是利用内置行为,只需通过其他键。
由于您的目标是映射箭头键来进行一些键盘选项卡导航,因此您应该将适当的命令映射到键并实现它们。ComponentCommands.MoveFocusForward
和ComponentCommands.MoveFocusBack
命令在这里是合适的,因为这就是我们正在做的,将焦点向前移动到下一个或返回到前一个控件。
这里有一个例子,你可以做到这一切。
首先,您需要将命令绑定到您的密钥。
<Window.CommandBindings>
<CommandBinding Command="ComponentCommands.MoveFocusForward" Executed="MoveFocusForward_Executed" />
<CommandBinding Command="ComponentCommands.MoveFocusBack" Executed="MoveFocusBack_Executed" />
</Window.CommandBindings>
<Window.InputBindings>
<KeyBinding Command="ComponentCommands.MoveFocusForward" Key="Right" />
<KeyBinding Command="ComponentCommands.MoveFocusBack" Key="Left" />
</Window.InputBindings>
然后实现处理程序。
private static bool RequestFocusChange(FocusNavigationDirection direction)
{
var focused = Keyboard.FocusedElement as UIElement;
if (focused != null)
{
return focused.MoveFocus(new TraversalRequest(direction));
}
return false;
}
private void MoveFocusForward_Executed(object target, ExecutedRoutedEventArgs e)
{
RequestFocusChange(FocusNavigationDirection.Next);
}
private void MoveFocusBack_Executed(object target, ExecutedRoutedEventArgs e)
{
RequestFocusChange(FocusNavigationDirection.Previous);
}