событие нажатия клавиши silverlight не срабатывает для клавиш со стрелками

StackOverflow https://stackoverflow.com/questions/222826

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть холст внутри прокрутки. Я прикрепил обработчик события keydown к scrollview. Для большинства ключей вызывается обработчик.

Однако для клавиш со стрелками обработчик не вызывается. Вместо этого вид прокрутки прокручивается в соответствующем направлении.

Я также прикрепил обработчик keyup к просмотру прокрутки, и вызывается keyup для клавиш со стрелками.

Есть ли способ получить событие нажатия клавиши со стрелкой здесь?

Это было полезно?

Решение 2

Я нашел этот глупый взлом, чтобы заставить его работать. Установка скролл-просмотра, чтобы он не был табуляцией, удерживает его от съедания ключевых событий ... но потом у меня появилось еще одно текстовое поле на странице, которое внезапно ВСЕГДА было сфокусировано, потому что скролл-просмотр больше не выполнялся. Поэтому я исправил это, позволив невидимому текстовому полю сфокусироваться.

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

Редактировать: мне также пришлось убрать текстовое поле с холста, потому что, несмотря на то, что оно было невидимым, его контур все еще отображался.

2-е редактирование. Я использовал текстовое поле, потому что это было первое, что я нашел, чтобы можно было захватывать события KeyDown. Тем не менее, UserControl может. Поэтому, вероятно, было бы лучше использовать UserControl вместо невидимого текстового поля. При необходимости вы можете вызвать Focus () в UserControl.

Другие советы

Просто используйте событие KeyUp. Работает как шарм.

Это возможный ответ - у меня не было возможности проверить это. У меня были подобные проблемы в прошлом, когда контроль потребляет события, прежде чем вы сможете их получить. Есть несколько вещей, которые вы можете попробовать:

<Ол>
  • Используйте событие PreviewKeyDown, я думаю, что так оно и называется. Это может позволить вам попасть на событие до того, как оно будет использовано элементом управления.
  • Попробуйте предложение mblandfo, хотя, если вы сделаете это, вы, вероятно, захотите обернуть все это в пользовательский элемент управления, чтобы скрыть то, что вы делаете, от остальной части вашего кода.
  • Добавьте обработчик ключа к объекту Canvas, возможно, вы сможете перехватить там событие, и "bubble" quot; это через ваше собственное событие.
  • За исключением 1) все это действительно считается хаком, но удачи, я надеюсь, что один из них вам подходит!

    " Используйте событие PreviewKeyDown, я думаю, что так оно и называется. Это может позволить вам попасть на событие до того, как оно будет использовано элементом управления. & Quot;

    Это работает. Просто установите аргументы события " Handled = true " и ScrollViewer (или ListBox) не будет захватывать событие после того, как вы уже обработали его. Мне не нужно было использовать свойство IsTabStop для ListBox; это, похоже, ничего не делало.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top