2017-02-09 12 views
7

大量のネストされたデータを含むWPFツリービューがあります。ロードされているデータの観点から仮想化を有効にしています。しかし、全体のビューが一度スクロールされるまでスクロールが不安定になり、何(何もない)が落ち着きます。 ScrollViewerをオーバーライドして、スクロール中にVirtualizingStackPanel内のHeightが不当に変化することがわかりました。ツリービューの仮想化と誤ったスクロール

誰でもこれを解決する方法を知っていますか?

ヘルプは評価されています。以下のTreeView XAMLの

関連セクション:ItemsPresenter内のすべてのアイテム(およびTreeViewは、ネストされたItemsPresentersItemsPresenterとして実装されている)場合

 <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

仮想のみうまく動作は同じ高さを有します。 TreeViewでは、これは通常そうではありません。

この主な理由は、それが仮想化されているので、それはそれはそれ以外の場合は、正確に測定するであろうと、特定の物事を推定しなければならないことである。

VirtualizationStackPanelは、すべての子どもたちが現在可視の子と同じ高さを持っていると仮定しますと推定されますScrollViewerに報告される、これに基づいた所望の高さ(実際にすべての子を測定するのではなく)は、子供の高さが可変であれば、この推定値はオフになり、スクロール位置に応じて変化し、スクロールバーのサイズ変更。