Я нашел этот глупый хак, чтобы заставить его работать. Установка скролл-просмотра, чтобы он не был табуляцией, удерживает его от съедания ключевых событий ... но потом у меня появилось еще одно текстовое поле на странице, которое внезапно ВСЕГДА было сфокусировано, потому что скролл-просмотр больше не выполнялся. Поэтому я исправил это, позволив невидимому текстовому полю сфокусироваться.
scrollView.IsTabStop = false;
invisibleTextBox.Foreground = new SolidColorBrush(Colors.Transparent);
invisibleTextBox.Background = new SolidColorBrush(Colors.Transparent);
Canvas.SetZIndex(invisibleTextBox, -1000);
invisibleTextBox.KeyDown += new KeyEventHandler(HandleKeyDown);
invisibleTextBox.KeyUp += new KeyEventHandler(HandleKeyUp);
Редактировать: мне также пришлось убрать текстовое поле с холста, потому что, несмотря на то, что оно было невидимым, его контур все еще показывался.
2nd Edit: Я использовал текстовое поле, потому что это было первое, что я обнаружил, что он может захватывать события KeyDown. Тем не менее, UserControl может. Поэтому, вероятно, было бы лучше использовать UserControl вместо невидимого текстового поля. При необходимости вы можете вызвать Focus () в UserControl.