WPF Datagrid в ScrollView захватывает детали строки События прокрутки ComboBox - PullRequest
0 голосов
/ 22 января 2020

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

Для того, чтобы «страница» прокручивалась, когда число строк / представление сведений о строках слишком долго толкает сетку, я обрабатываю событие PreviewMouseWheel в сетке данных. Это работает до тех пор, пока в моих строках не появится комбинированный список с раскрывающимся списком, в котором есть достаточно элементов, которые также необходимо прокрутить.

При использовании колесика мыши прокручиваемый список будет прокручиваться, как и внешняя сетка данных, эффективно прокручивая содержимое «позади» выпадающего списка и оставляя выпадающий список не в том месте.

Мой обработчик события PreviewMouseWheel делает следующее:

private void StampPartsDatagrid_PreviewMouseWheelForScrolling(object sender, MouseWheelEventArgs e)
{
    StampingScrollViewer.ScrollToVerticalOffset(StampingScrollViewer.VerticalOffset - e.Delta / 3);
}

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

Я просмотрел много статей о MSDN и SO, но они были в основном о том, чтобы заставить таблицу данных прокручиваться внутри прокрутки просмотра.

Есть ли способ выполнить проверку попадания в событии прокрутки предварительного просмотра? Должен ли я каким-то образом заманивать мышь в ловушку? Должен ли я обрабатывать прокрутку по-другому?

Спасибо

* РЕДАКТИРОВАТЬ * Я решил эту проблему. Я переосмыслил поведение колесика мыши. Просматривая страницу панели настроек Windows для регионов, в которой отображается очень длинный комбинированный список, я обнаружил, что, если комбинированный список был удален, колесико мыши применялось только к удаленному списку. Перемещение мыши за пределы выпадающего списка и прокрутка колесиком не имеют никакого эффекта.

Учитывая это, я применил то же поведение, улавливая события открытия / закрытия закрытия и управляя внешней прокруткой. Мой новый обработчик событий, взятый из этого поста (https://social.msdn.microsoft.com/Forums/vstudio/en-US/6fc503a6-ba53-4395-b9b8-f56301efd097/mousescroll-of-combobox-scrolls-the-page-as-well?forum=wpf), выглядит так:

private void StampPartsDatagrid_PreviewMouseWheelForScrolling(object sender, MouseWheelEventArgs e)
{
    if (!bDetailsComboDropped)
    { 
        StampingScrollViewer.ScrollToVerticalOffset(StampingScrollViewer.VerticalOffset - e.Delta / 3);
    }
}

1 Ответ

0 голосов
/ 23 января 2020

Если вам не нравится поле bDetailsComboDropped, вы также можете попытаться определить, откуда исходит перенаправленное событие предварительного просмотра колеса мыши. В частности, проверьте e. OriginalSource , чтобы получить ссылку на элемент WPF, который фактически инициировал событие (или e.Source, если вы найдете его лучше для этой цели).

Объедините это с рекурсивная функция, использующая VisualTreeHelper.GetParent для проверки того, является ли какой-либо из родительских элементов частью поля со списком, или она заканчивается вашим root средством просмотра прокрутки.

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

...