2015-10-14 64 views
4

问题概述:
在比TextBox高的电平定义的任何KeyBinding的(与指派无修饰键),可以防止用户从TextBox内键入这些密钥。WPF键绑定吞咽键,防止文本框使用

最小XAML层次:

<Window> 
    <UserControl> 
    <Border> 
     <UserControl> 
     <TextBox> 

最小命令/键绑定:

<UserControl.Resources> 
    <RoutedUICommand x:Key="Commands.SomeCommand" /> 
</UserControl.Resources> 
<UserControl.InputBindings> 
    <KeyBinding Key="A" Command="{StaticResource Commands.SomeCommand} /> 
</UserControl.InputBindings> 
<UserControl.CommandBindings> 
    <CommandBinding Command="{StaticResource Commands.SomeCommand}" Executed="..." /> 
</UserControl.CommandBindings> 

Command的和KeyBinding,在所述第一UserControl级定义的。所以在这个例子中,在文本框中,用户可以自由输入,直到他们按下A键,然后它不会将该字母插入到文本框中。我可以清楚地看到,TextBox.KeyDownTextBox.PreviewKeyDown射击,当你按下键A(和Handled = false),但信不会被添加到文本框中的文本和TextBox.PreviewTextInput火。

我正在寻找任何建议,可能表明什么吞咽按键,并阻止它得到处理的文本框,或任何有关我如何调试此问题。

编辑:
感谢Snoop,我能够清楚地看到问题。

  1. TextBox.PreviewKeyDown隧道下来,大火通过视觉树,开始在窗口,在文本框
  2. TextBox.KeyDown气泡回结束了起始于文本框,并朝窗户
  3. TextBox.KeyDown被处理好的设置为标题通过设置KeyBinding的第一个UserControl为true。
  4. TextBox.PreviewTextInput从不触发,文本框也不处理输入,因为KeyDown事件被设置为已处理。

这仍然留下问题,如何防止UserControl处理输入,如果文本框有焦点?在命令执行过程中,我可以检查文本框是否有键盘焦点,但是现在已经太晚了。

+2

我相信[Snoop](https://snoopwpf.codeplex.com)有一个选项来监视事件。 – mnistic

+0

@mnistic:感谢您的建议,我能够找到一些额外的细节并更新了问题。 – caesay

回答

0

TextInputPreviewTextInput仅在文本实际更改/可能更改时触发。

当您更新了您的问题以反映该问题时,Command截取了该事件并且从未提出(预览)TextInput事件。

最好的解决方案是将修饰键添加到您的KeyBinding中,但我怀疑这不是您的首选方式。

另一种选择是e.Handle上文本框PreviewKeyDown事件和自己提高TextComposition事件,使用类似:

target.RaiseEvent(new TextCompositionEventArgs(InputManager.Current.PrimaryKeyboardDevice, 
new TextComposition(InputManager.Current, target, "A")) 
{ 
    RoutedEvent = TextCompositionManager.TextInputEvent 
}); 

(或者,插入textBox.Text在正确的CaretIndex

真相被告知,它仍然是一个黑客。

+0

我试图避免在PreviewKeyDown中处理自己的按键,因为我认为这将很难得到正确的。我不知道我可以自己提出一个文本组合事件,它让事情变得更加简单 - 而且我最终实现了一个使用它的解决方案,所以我给你的是可以接受的。 – caesay

2

我有同样的问题。 我接过来一看,以文档为关键bindind,且有描述,其上绑定的关键不应该仅仅是关键,但关键姿势,所以它应是

  • 键修改器+普通键
  • 数字小键盘键
  • 功能键。

当然,它只适用于A,但它总体上是不好的做法。你应该考虑实施一些后面提到的可能性。更多在https://msdn.microsoft.com/cs-cz/library/system.windows.input.keybinding(v=vs.110).aspx