TreeView скачкообразная прокрутка
У меня есть виртуализированный TreeView с этими свойствами:
<TreeView
ScrollViewer.CanContentScroll="True"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.IsVirtualizingWhenGrouping="True"
VirtualizingStackPanel.ScrollUnit="Pixel"
VirtualizingStackPanel.CacheLength="20,20"
VirtualizingStackPanel.CacheLengthUnit="Item"
/>
...
</TreeView>
TreeViewItem примерно одинаковой высоты.
Проблема заключается в том, что при прокрутке вниз ручка полосы прокрутки меняет размер, и прокрутка "скачет", что приводит к довольно плохому восприятию пользователя.
Как можно получить более плавный UX?
2 ответа
Я понимаю, что это старый пост, и у вас, вероятно, есть решение сейчас, но у него есть простой ответ, поэтому для всех, кто может столкнуться с этим в будущем, вот оно:
Поведение, которое вы описываете, нормальное. Если бы вы искали в MSDN для ScrollViewer.CanContentScroll
это самое первое свойство, которое вы использовали, вы нашли бы это:
Содержимое в ScrollViewer можно прокручивать с точки зрения физических единиц или логических единиц. Физические единицы - это независимые от устройства пиксели. Логические единицы используются для прокрутки элементов в ItemsControl. Поведение ScrollViewer по умолчанию заключается в использовании физических единиц для прокрутки его содержимого. Однако в тех случаях, когда CanContentScroll имеет значение true, содержимое может использовать логические единицы для прокрутки. Например, ListBox, ListView и другие элементы управления, которые наследуются от ItemsControl, используют для прокрутки логические единицы. Если CanContentScroll имеет значение true, значения свойств ExtentHeight, ScrollableHeight, ViewportHeight и VerticalOffset являются количеством элементов, а не физическими единицами.
Если вам требуется физическая прокрутка вместо логической прокрутки, оберните элемент панели хоста в ScrollViewer и установите для его свойства CanContentScroll значение false. Физическая прокрутка является режимом прокрутки по умолчанию для большинства элементов Panel.
Таким образом, это в основном означает, что вы можете прокручивать пиксели или целые элементы из коллекции. Поэтому, чтобы иметь плавную прокрутку, вам нужно прокручивать, используя пиксели. Для этого вам просто нужно установить ScrollViewer.CanContentScroll
собственность на False
, Вот и получается, что это легко исправить.
К сожалению, настройка ScrollViewer.CanContentScroll = False
отключит виртуализацию, поэтому не поможет в решении этой проблемы.
Я обнаружил, что установка жестко запрограммированного значения высоты для содержимого вашего TreeViewItem делает полосу прокрутки намного лучше, но полоса прокрутки все же немного изменяется.