событие нажатия клавиши silverlight не срабатывает для клавиш со стрелками - PullRequest
4 голосов
/ 21 октября 2008

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 04 декабря 2012

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

1 голос
/ 22 октября 2008

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

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.

0 голосов
/ 31 декабря 2009

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

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

0 голосов
/ 27 октября 2008

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

  1. Используйте событие PreviewKeyDown, думаю, так оно и называется. Он может позволить вам попасть на событие до того, как оно будет использовано элементом управления.
  2. Попробуйте предложение mblandfo, хотя если вы сделаете это, вы, вероятно, захотите обернуть все это в пользовательский элемент управления, чтобы скрыть то, что вы делаете, от остальной части вашего кода.
  3. Добавьте ключевой обработчик к объекту Canvas, вы можете поймать событие там и «всплыть» через собственное событие.

За исключением 1) все это действительно считается хаком, но удачи, я надеюсь, что один из них вам подходит!

...