Событие колесика мыши не работает корректно в lisbox, когда внутри него есть прокрутки - PullRequest
4 голосов
/ 26 января 2012

У меня есть внешний список с вертикальной полосой прокрутки, и для каждого элемента у меня есть прокрутка, которая может иметь горизонтальную полосу прокрутки. Проблема в том, что когда я использую мышь, событие не попадает во внешний список, поэтому прокрутка не работает. Я уже установил Focusable = false на просмотрщиках прокрутки, но это только мешает им обрабатывать события клавиатуры, а не события мыши. Как я могу остановить внутренний прокручивающий просмотр от перехвата события колеса мыши и позволить ему всплывать до внешнего списка?

Ответы [ 2 ]

1 голос
/ 26 октября 2017

Проблема в том, что в самом ListBox есть ScrollViewer, который проглатывает события колеса мыши, прежде чем они смогут добраться до родительского ScrollViewer, содержащего ваш ListBox.

Вам необходимо обработать события колеса мыши предварительного просмотра наListBox и, таким образом, предотвращают их туннелирование дальше вниз, в то же время, вызывая событие пузыря для родительского ScrollViewer.

Это сработало для меня:

private void ListBoxThatNowScrolls_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
    e.Handled = true;

    var e2 = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
    e2.RoutedEvent = ListBox.MouseWheelEvent;
    e2.Source = e.Source;

    ListBoxThatNowScrolls.RaiseEvent(e2);
}
1 голос
/ 11 февраля 2012

Вы можете найти несколько хороших примеров здесь .Описывает, как отключить колесо мыши в ItemsControl

...