2015-10-14 4 views
4

Проблема Обзора:
Любых 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, я смог четко видеть проблему.

  1. TextBox.PreviewKeyDown туннели вниз и пожары через визуальное дерево, начиная с окна, и заканчивающиеся на TextBox
  2. TextBox.KeyDown пузыри обратно вверх, начиная с TextBox и заголовок к окну
  3. TextBox.KeyDown получает Handled сет true с помощью первого UserControl, который имеет набор KeyBinding.
  4. TextBox.PreviewTextInput никогда не срабатывает, и текстовое поле не обрабатывает вход, потому что событие KeyDown было настроено как обработанное.

Это все еще оставляет проблему, как вы мешаете UserControl обрабатывать ввод, если текстовое поле имеет фокус? В рамках выполнения команды я могу проверить, имеет ли текстовое поле фокус клавиатуры, но к этому времени уже слишком поздно.

+2

Я считаю, что [Snoop] (https://snoopwpf.codeplex.com) имеет возможность отслеживать события. – mnistic

+0

@mnistic: Спасибо за предложение, я смог найти дополнительные сведения и обновил вопрос. – caesay

ответ

0

TextInput и PreviewTextInput только срабатывает, когда текст действительно изменяется/может меняться.

Как вы обновили свой вопрос, чтобы отразить, перехватывает событие Command и события (Preview) TextInput никогда не поднимаются.

Самое приятное решение - добавить ключ-модификатор к вашему KeyBinding, но я подозреваю, что это не ваш предпочтительный способ.

Другим вариантом было бы e.Handle это событие PreviewKeyDown на TextBox и поднять TextComposition событий самостоятельно, используя что-то вроде:

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

(В качестве альтернативы, вставить в textBox.Text при правильной CaretIndex)

Истины скажем, это все равно будет взломом.

+0

Я старался избегать обращения с клавишами самостоятельно в PreviewKeyDown, потому что я думал, что будет сложно получить право. Я не знал, что могу сам создать событие textcomposition, но это упростило ситуацию, и я решил использовать это решение, поэтому я даю вам согласие. – caesay

2

У меня такая же проблема. Я посмотрел документацию для ключа bindind, и описано, что ключ, на котором вы свяжете должны быть не просто ключ, но ключ жест, поэтому он должен быть

  • Модификатор ключ + нормальный ключ
  • Цифровая клавиатура
  • Функциональный ключ.

Конечно, он работает только с A, но это плохая практика. Вы должны рассмотреть возможность реализации некоторых из упомянутых выше возможностей. Подробнее на https://msdn.microsoft.com/cs-cz/library/system.windows.input.keybinding(v=vs.110).aspx

Смежные вопросы