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

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

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

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

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


person Mike Blandford    schedule 21.10.2008    source источник


Ответы (4)


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

person Prashanth Subramanian    schedule 04.12.2012

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

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.

person Mike Blandford    schedule 21.10.2008

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

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

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

person George Sealy    schedule 27.10.2008

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

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

person Community    schedule 31.12.2009
comment
который работает в WPF, но в silverlight нет клавиши предварительного просмотра - person Mike Blandford; 06.01.2010