2017-02-09 3 views
7

У меня есть дерево WPF с большим объемом вложенных данных. Я включил виртуализацию, которая работает с точки зрения загружаемых данных. Но прокрутка стала неустойчивой до тех пор, пока весь вид не прокручивается один раз, а затем окупит некоторые (еще не большие). Я переопределяю ScrollViewer, и я вижу, что высота Height в VirtualizingStackPanel изменяется с ошибкой во время прокрутки.Виртуализация Treeview и неустойчивая прокрутка

Кто-нибудь знает, как это можно решить?

Любая помощь приветствуется.

Соответствующие разделы TreeView Xaml ниже:

 <TreeView ItemsSource="{Binding Folders.ObservableTree}" Name="FoldersTreeView" 
       AutomationProperties.AutomationId="foldersview_treeview_folders" TabIndex="0" PreviewMouseRightButtonDown="OnPreviewMouseRightButtonDown" 
       VirtualizingStackPanel.CleanUpVirtualizedItem="VirtualizingStackPanel_OnCleanUpVirtualizedItem" 
       ScrollViewer.VerticalScrollBarVisibility="Auto" 
       ScrollViewer.IsDeferredScrollingEnabled ="True" 
       VirtualizingStackPanel.IsVirtualizing="True" 
       ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
       VirtualizingStackPanel.ScrollUnit="Pixel" 
       VirtualizingStackPanel.VirtualizationMode="Standard" 
       VirtualizingPanel.IsVirtualizingWhenGrouping="True" 
       VirtualizingStackPanel.CacheLengthUnit="Item"> 

     <TreeView.ItemsPanel> 
       <ItemsPanelTemplate> 
       <VirtualizingStackPanel IsItemsHost="True" CanVerticallyScroll="True"/> 
      </ItemsPanelTemplate> 
      </TreeView.ItemsPanel> 
     <TreeView.Template> 
      <ControlTemplate> 
       <view:ScrollViewer2 Padding="{TemplateBinding Control.Padding}" Focusable="False" Name="TreeViewScrollViewer" 
           CanContentScroll="True"> 
        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" /> 
       </view:ScrollViewer2> 
      </ControlTemplate> 
     </TreeView.Template> 
+0

Вы нашли решение на это? – Yvonnila

+0

К сожалению, я этого не делал, я заменил элемент управления DevExpress TreeListView, поскольку у нас есть подписка на него, у этого есть некоторые встроенные оптимизации и хорошо работает. – Sjblack

ответ

0

виртуализация работает только хорошо, если все элементы в ItemsPresenterTreeView реализован в виде ItemsPresenter с вложенной ItemsPresenters) имеют одинаковую высоту. С TreeView это обычно не так.

Основная причина этого заключается в том, что, так как он виртуализации, он должен оценить некоторые вещи, которые были бы иначе измерять именно:

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

Смежные вопросы