WPF: ответственны ли ListBox или Panel за навигацию колесиком мыши? - PullRequest
3 голосов
/ 17 марта 2009

У меня есть собственный ListBox, который использует пользовательскую панель в качестве ItemsHost. Я хочу управлять вводом колесика мыши, чтобы при повороте колесика изменялся один выбранный элемент.

Я считаю, что лучший способ сделать это - обработать событие OnPreviewMouseWheel (хотя это только то, что мне нужно, поскольку оно не предоставляет данные о горизонтальном колесе).

Теперь главный вопрос: есть ли лучшая практика, где обрабатывать OnPreviewMouseWheel? В ListBox (который по умолчанию не имеет понятия о расположении дочерних элементов Panel) или в Panel (который по умолчанию не имеет понятия о свойстве IsSelected своих дочерних элементов)?

Ответы [ 2 ]

0 голосов
/ 01 апреля 2009

Это должно быть сделано из ListBox, поскольку только он знает, какой элемент выбран в данный момент. Панель не хочет или не должна знать, выбрана она или нет.

Я бы порекомендовал реализовать это как прикрепленное поведение, чтобы вы могли повторно использовать эту функцию несколько раз.

Для этого:
- создать новый класс (возможно, с именем ListBoxSelector) с прикрепленным свойством MouseWheelChangesSelection (true / false).
- добавьте PropertyNotifyChangedEvent и при изменении свойства зарегистрируйте прослушиватель событий для событий PreviewMouseWheel / MouseWheel.

Вы можете изменить текущий выбранный элемент одним из следующих способов:
- увеличение выбранного индекса; или
- с использованием перемещения источника представления коллекции предыдущая / следующая

0 голосов
/ 17 марта 2009

Я думаю, вы должны сделать это с ListBox. ListBox наследуется от Selector , который обрабатывает все, что связано с выбором.

Поведение выбора колесика мыши может применяться к любому виду Panel (возможно, было бы неплохо реализовать его сначала с использованием стандартного ListBox), и вы можете использовать Panel где-то за пределами ListBox где логика выбора не имеет смысла.

...