在WPF键处理程序中,我可以通过编程方式更改/覆盖按下的键吗?



正如标题中所述,我们试图拦截一个键并用另一个键替换它。类似于键映射

我们的具体用法是改变左方向键和右方向键的行为,分别像Shift-Tab和Tab。

现在我知道我可以拦截这些并手动控制焦点,但我正在尝试尽可能多地利用内置导航行为。我们只是想(也)使用箭头键来实现这种行为。

我唯一能想到的是吞下事件,然后用正确的参数重新抛出它,但我担心这会干扰像键释放,重复等。

如果这实际上是不可能的,我也愿意采用其他方法。同样,我们的目标是利用内置行为,只需通过其他键。

由于您的目标是映射箭头键来进行一些键盘选项卡导航,因此您应该将适当的命令映射到键并实现它们。ComponentCommands.MoveFocusForwardComponentCommands.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);
}

相关内容

  • 没有找到相关文章