почему установка ScrollViewer.CanContentScroll в false отключает виртуализацию

Как известно большинству разработчиков WPF, установка ScrollViewer.CanContentScroll в false приведет к отключению виртуализации; но я хотел бы знать, как это работает, потому что я пытаюсь включить виртуализацию при установке ScrollViewer.CanContentScroll в false .

    «ScrollViewer в настоящее время разрешает два режима прокрутки: плавная прокрутка по пикселям (CanContentScroll = false) или отдельная прокрутка по элементам (CanContentScroll = true). В настоящее время WPF поддерживает виртуализацию пользовательского интерфейса только при прокрутке по элементу. также называемая «физическая прокрутка», а прокрутка на основе элементов также называется «логическая прокрутка».

    Для виртуализации требуется прокрутка на основе элементов, чтобы она могла отслеживать логические единицы (элементы), которые в настоящее время видны … Установка ScrollViewer на прокрутку на основе пикселов больше не существует понятия логических единиц, а только пикселей !!!

    Виртуализация пользовательского интерфейса

    Меня часто спрашивают, есть ли способ обойти это ограничение. Ну, все возможно, но нет легкого обходного пути. Вам придется повторно реализовать значительную часть текущей логики виртуализации, чтобы комбинировать прокрутку на основе пикселей с виртуализацией пользовательского интерфейса. Вам также придется решить некоторые интересные проблемы, которые приходят с ним. Например, как вы вычисляете размер большого пальца, когда контейнеры элементов имеют разную высоту? (Помните, что вы не знаете высоту виртуализированных контейнеров – вы знаете только высоту отображаемых в настоящее время контейнеров.) Вы можете предположить среднее значение, основанное на высотах, которые вы знаете, или вы можете сохранить список с помощью высоты предметов, поскольку предметы вносились в память (что увеличивало бы точность большого пальца при взаимодействии пользователя с элементом управления). Вы также можете решить, что прокрутка на основе пикселей работает только с элементами, имеющими одну и ту же высоту – это упростит решение. Итак, да, вы могли бы найти решение, чтобы обойти это ограничение, но это не тривиально.

    Давайте будем гением компьютера.