2017-02-09 18 views
7

Mam widok drzewa WPF z dużą ilością zagnieżdżonych danych Włączyłem wirtualizację, która działa pod względem ładowanych danych. Ale przewijanie stało się niestabilne, dopóki cały widok nie został przewinięty, a następnie ustabilizuje to, co (nadal nie jest świetne). Zastąpiłem ScrollViewer i widzę, że zasięg w ramach VirtualizingStackPanel zmienia się nieprawidłowo podczas przewijania.Wirtualizacja widoku drzewa i błędne przewijanie

Czy ktoś wie o sposobie rozwiązania tego problemu?

Każda pomoc jest oceniana.

odpowiednie sekcje TreeView Xaml poniżej:

 <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

Czy znalazłeś rozwiązanie w tej sprawie? – Yvonnila

+0

Niestety nie, zastąpiłem kontrolkę DevExpress TreeListView, ponieważ mamy subskrypcję, to ma wbudowane optymalizacje i działa dobrze. – Sjblack

Odpowiedz

0

wirtualizacji tylko działa dobrze, jeśli wszystkie pozycje w ItemsPresenter (i TreeView jest zaimplementowany jako ItemsPresenter z zagnieżdżonego ItemsPresenters) mają taką samą wysokość. W przypadku modelu TreeView zwykle tak nie jest.

Głównym powodem jest to, że ponieważ jest wirtualizacji, to musi oszacować pewne rzeczy, że będzie inaczej mierzą dokładnie:

VirtualizationStackPanel będzie przejąć wszystkie dzieci mają taką samą wysokość jak obecnie widocznych dzieci i oszacuje na tej podstawie pożądana wysokość (zamiast rzeczywistego pomiaru wszystkich dzieci), która zostanie zgłoszona do ScrollViewer, jeśli dzieci mają zmienną wysokość, oszacowanie to może być wyłączone i ulegnie zmianie w zależności od pozycji przewijania, co powoduje ciągłe zmiana rozmiaru paska przewijania.

Powiązane problemy