2009-03-17 2 views
3

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

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

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

ответ

0

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

поведения выбора

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

0

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

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

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

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