Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

Вы можете восстановить виртуализацию с помощью VirtualizingPanel.ScrollUnit="Pixel" (в .NET> = 4.5).