Wpf ListBox Scrolling с клавиатурой - PullRequest
0 голосов
/ 08 марта 2011

Хорошо, у меня есть список и триггер, определенный для элемента списка следующим образом:

 <DataTrigger Binding="{Binding IsMouseOver,RelativeSource={RelativeSource Self}}" Value="True">
   <Setter Property="IsSelected" Value="True" />
  </DataTrigger>

Это работает нормально, как только я наведу курсор мыши на элемент списка, он выбирается.проблема возникает, когда я пытаюсь прокрутить список с помощью стрелки вниз.Итак, предположим, что моя мышь находится над третьим элементом в списке, который выбран по умолчанию.Теперь, когда я нажимаю стрелку вниз, первый элемент выбран!Кроме того, когда я продолжаю удерживать нажатой стрелку вниз, только видимый список прокручивается правильно, как только выделение перемещается к элементу, который ранее не отображался, выделение возвращается к тому элементу, над которым была наведена мышь, и прокрутка начинается стам! ... так что, другими словами, прокрутка клавиатуры работает нормально, когда мышь вообще не находится над списком ... Я очень надеюсь, что прояснил ситуацию.

Возможно, я делаю здесь что-то глупоеи любые предложения приветствуются Спасибо

1 Ответ

0 голосов
/ 10 марта 2011

Ух ты, это самый забавный триггер:)

Такое поведение является ожидаемым, поскольку выбранный элемент фокусируется с помощью ListBoxItem, а при обновлении ScrollBar изменяется свойство IsMouseOver для нового элемента под мышью.

В основном вам необходимо отключить выбор элемента под мышью, если одновременно происходит выделение клавиатуры:

Предупреждение о взломе:

EventManager.RegisterClassHandler(typeof(ListBoxItem), ListBoxItem.SelectedEvent, new RoutedEventHandler(
            (s, e) => e.Handled = (Keyboard.IsKeyDown(Key.Down) || Keyboard.IsKeyDown(Key.Up)) && (s as FrameworkElement).IsMouseOver), true);

Поместите вышесказанное в любой статический конструктор. Это грубо, но работает для меня.

...