WPF ListView Проблема с навигацией с клавиатуры - PullRequest
3 голосов
/ 16 февраля 2010

У меня есть такой список

ListView:
---------

  • Манго
  • Оранжевый
  • Виноград
  • Виноград
  • Виноград
  • Apple
  • Клубника

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

Это из-за виртуализации?
Кажется, только дублированные данные (виноград) создают проблему. Любая помощь?

Ответы [ 3 ]

4 голосов
/ 17 февраля 2010

Пунктирный прямоугольник - ваш фокус клавиатуры. Синий прямоугольник - ваш выбор.

Когда вы двигаетесь вниз по клавиатуре, фокусируете треки там, где вы находитесь. Однако выбор отслеживает, какой элемент выбран. Когда один и тот же элемент находится в списке несколько раз, прямоугольник выбора может быть показан только на одном из них.

Чтобы сделать это так, как вы ожидаете, оберните ваши элементы внутри вашей ObservableCollection. Так что вместо:

coll.Add(fruit);

вы бы написали

coll.Add(new FruitWrapper(fruit));

В вашем ListBox вашем ItemTemplate может быть один ContentPresenter, представляющий фрукты внутри обертки (например, <ContentPresenter Content="{Binding Fruit}" />).

2 голосов
/ 16 февраля 2010

Думайте о синей подсветке как о выбранном элементе данных. Виноград дублируется, поэтому выбор данных не меняется.

Пунктирный прямоугольник - это фокус клавиатуры, который заботится только о ListViewItem, который представляет элемент данных.

Итак, есть один объект Grapes, представленный 3 ListViewItem объектами.

1 голос
/ 16 февраля 2010

У вас один и тот же объект "Виноград" в ObservableCollection 3 раза, я имею в виду объект с той же ссылкой. И Listbox - беспорядок с этим. Каждый элемент должен быть уникальным экземпляром.

...