Проблема Обзора:
Любых KeyBinding
-х, определенной на уровень выше, чем TextBox
(без какого-либо модификаторов клавиша, назначенного), позволяет пользователю вводить эти ключи внутри TextBox
.WPF KeyBinding глотание ключей, предотвращая использование TextBox
Минимальная XAML Иерархия:
<Window>
<UserControl>
<Border>
<UserControl>
<TextBox>
Минимальная Команда/KeyBinding:
<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.KeyDown
и TextBox.PreviewKeyDown
является обжигом при нажатии клавиши (A
и Handled = false
), но письмо не будет добавляться в текст текстового поля и TextBox.PreviewTextInput
делает не огня.
Я ищу любые предложения, которые могут указывать на то, что проглатывает нажатие клавиши и прекращает ее обработку TextBox или что-то связанное с тем, как я могу отладить эту проблему.
EDIT:
Благодаря Snoop, я смог четко видеть проблему.
TextBox.PreviewKeyDown
туннели вниз и пожары через визуальное дерево, начиная с окна, и заканчивающиеся на TextBoxTextBox.KeyDown
пузыри обратно вверх, начиная с TextBox и заголовок к окнуTextBox.KeyDown
получает Handled сет true с помощью первого UserControl, который имеет набор KeyBinding.TextBox.PreviewTextInput
никогда не срабатывает, и текстовое поле не обрабатывает вход, потому что событие KeyDown было настроено как обработанное.
Это все еще оставляет проблему, как вы мешаете UserControl обрабатывать ввод, если текстовое поле имеет фокус? В рамках выполнения команды я могу проверить, имеет ли текстовое поле фокус клавиатуры, но к этому времени уже слишком поздно.
Я считаю, что [Snoop] (https://snoopwpf.codeplex.com) имеет возможность отслеживать события. – mnistic
@mnistic: Спасибо за предложение, я смог найти дополнительные сведения и обновил вопрос. – caesay