gpt4 book ai didi

c# - WPF KeyBinding 吞咽键,防止 TextBox 使用

转载 作者:太空狗 更新时间:2023-10-29 23:37:48 27 4
gpt4 key购买 nike

问题概述:
在高于 TextBox 的级别定义的任何 KeyBinding(未分配修改键)会阻止用户在 TextBox 中键入这些键>.

最小的 XAML 层次结构:

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

最小命令/键绑定(bind):

<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>

CommandKeyBinding 是在first UserControl 级别定义的。因此,在此示例中,在文本框中,用户可以自由键入,直到他们按下 A 键,然后才不会将字母插入文本框。当您按下 A 键时,我可以清楚地看到 TextBox.KeyDownTextBox.PreviewKeyDown 正在 触发(和 Handled = false) ,但该字母不会添加到文本框的文本中,并且 TextBox.PreviewTextInput 不会触发。

我正在寻找任何可能表明是什么吞下了按键并阻止它被 TextBox 处理的建议,或者与我如何调试此问题相关的任何建议。

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

  1. TextBox.PreviewKeyDown 向下隧道并触发可视化树,从 Window 开始,到 TextBox 结束
  2. TextBox.KeyDown 从 TextBox 开始向窗口弹出气泡
  3. TextBox.KeyDown 由第一个设置了 KeyBinding 的 UserControl 将 Handled 设置为 true。
  4. TextBox.PreviewTextInput 从不触发,文本框也不处理输入,因为 KeyDown 事件已设置为已处理。

这仍然存在问题,如果文本框具有焦点,如何防止 UserControl 处理输入?在命令执行中,我可以检查文本框是否具有键盘焦点,但此时为时已晚。

最佳答案

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

当您更新您的问题以反射(reflect)时,Command 拦截该事件并且永远不会引发(预览)TextInput 事件。

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

另一种选择是 e.Handle TextBox 上的 PreviewKeyDown 事件并自己引发 TextComposition 事件,使用类似的方法:

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

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

说实话,这仍然是一个 hack。

关于c# - WPF KeyBinding 吞咽键,防止 TextBox 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33133485/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com