2011-09-19 60 views
2

正如标题中所述,我们试图截取一个密钥并将其替换为另一个密钥。认为类似于关键重新映射。在WPF密钥处理程序中,我可以通过编程更改/覆盖按下的密钥吗?

我们的具体用法是将左右箭头键分别改为Shift-Tab和Tab。

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

我能想到的唯一的事情就是吞咽事件,然后用正确的参数重新抛出,但我很担心,这将有类似的事情键释放干扰,重复等

我如果这种做法实际上不可行,也可以采取其他方式来做到这一点。再次,我们的目标是利用内置的行为,只需通过其他键。

+0

不知道是否可以更改事件以指示不同的键;但您应该能够将事件标记为“处理”,然后使用重新映射的关键点创建一个新事件。 – EtherDragon

+0

是的,这就是我上面所说的,但我担心的是,通过将其标记为“已处理”,我可能会失去其他内容,例如发布,重复等。猜测是时候让测试应用程序了! – MarqueIV

+0

与其尝试重新映射键,为什么不将键绑定到与“Tab”和“Shift-Tab”组合绑定的任何命令? –

回答

3

由于您的目标是映射箭头键来执行某些键盘选项卡导航,因此您应该将相应的命令映射到键并实施它们。 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); 
} 
+0

问题给你......我想知道为什么你甚至在第一时间添加了处理程序和命令绑定。不会简单地设置InoutBinding做伎俩吗? (在我们的代码中,实际上是其他事情正在发生,所以我正在用您的代码构建一个测试应用程序以找出问题,但如果这些是标准命令,标准控件是否不应该对它们进行本质响应? – MarqueIV

+0

至于I知道,预定义的命令只是提供一组标准命令来绑定的手段,没有与它们相关的实现,你可以允许一个“Open”命令来做一些对你的应用程序有意义的事情,而不一定会引起一个FileOpenDialog(或其他预定义的行为)。我知道你正在寻找那种预定义的行为,但我担心它不可用。 –

+0

我当然会赞同'开放'之类的东西,但是您提到的这些命令是已经存在的预定义行为。换句话说,'Open'没有上下文,除了以特定于应用程序的方式,但将焦点移到下一个控件不是特定于应用程序的事情,而是OS级别的事情,所以我不确定该声明实际上是正确的,因为再次,该行为*已经实施。它是如何被调用的。必须有一种方法可以利用内置的行为,而无需像这里所做的那样重新编写它们的实现。 – MarqueIV

相关问题