2017-01-04 10 views
1

で仮想化を失い、私はXAMLで、次のツリービューを持っているとき(のItemsSourceはリストのリストの長いリストにコードビハインドを経由して設定されている):ツリービューは、オーバーライドされたコントロールテンプレート

<TreeView x:Name="Tree" 
      VirtualizingPanel.IsVirtualizing="True" 
      ScrollViewer.CanContentScroll="True"> 
    <!-- ItemTemplate and ItemContainerStyle ommitted for brevity --> 
</TreeView> 

仮想化だけで正常に動作します。しかし、内部のScrollViewerのテンプレートと共にTreeViewのテンプレートを上書きしようとすると、仮想化が消えてしまいました。私のテンプレートはデフォルトと同じように見えますが、私が取り出した色付きの矩形はテンプレートを再定義する動機です。

<TreeView.Template> 
     <ControlTemplate TargetType="{x:Type TreeView}"> 
      <ScrollViewer Focusable="False" 
          CanContentScroll="True"> 
       <ScrollViewer.Template> 
        <ControlTemplate TargetType="{x:Type ScrollViewer}"> 
         <Grid> 
          <Grid.RowDefinitions> 
           <RowDefinition /> 
           <RowDefinition Height="auto" /> 
          </Grid.RowDefinitions> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition /> 
           <ColumnDefinition Width="auto" /> 
          </Grid.ColumnDefinitions> 

          <ScrollContentPresenter Grid.Column="0" Grid.Row="0" /> 

          <ScrollBar x:Name="PART_VerticalScrollBar" 
             Orientation="Vertical" 
             Grid.Row="0" Grid.Column="1" 
             Value="{TemplateBinding VerticalOffset}" 
             Maximum="{TemplateBinding ScrollableHeight}" 
             ViewportSize="{TemplateBinding ViewportHeight}" 
             Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" /> 

          <ScrollBar x:Name="PART_HorizontalScrollBar" 
             Orientation="Horizontal" 
             Grid.Row="1" Grid.Column="0" 
             Value="{TemplateBinding HorizontalOffset}" 
             Maximum="{TemplateBinding ScrollableWidth}" 
             ViewportSize="{TemplateBinding ViewportWidth}" 
             Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" /> 
         </Grid> 
        </ControlTemplate> 
       </ScrollViewer.Template> 
       <ScrollViewer.Content> 
        <ItemsPresenter x:Name="ItemsPresenter" /> 
       </ScrollViewer.Content> 
      </ScrollViewer> 
     </ControlTemplate> 

私は一時的にちょうどツリービューのリソースで{x:Static SystemColors.ControlBrushKey}という名前の透明SolidColorBrushをすることによってこの問題を回避得ているが、私は間違って何をやったかを知ることを好むだろう。あなたはそれを期待していないとき

答えて

0

問題が見つかりました。 ScrollViewerテンプレートの場合、ScrollContentPresenterにはテンプレート化された親の値にCanContentScrollが設定されている必要があります。

<ScrollContentPresenter Grid.Column="0" Grid.Row="0" 
         CanContentScroll="{TemplateBinding CanContentScroll}" /> 
0

多くの要因は時々、UIの仮想化を破ることができます。

ScrollViewerの中であなたのリストコントロールを置く
  1. :ScrollViewerのは その子コンテンツ上にウィンドウを提供します。問題は、子コンテンツに無制限の "仮想" スペースが与えられていることです。この仮想空間では、ListBoxがフルサイズでレンダリングされ、子要素のすべてが表示されます。 副作用として、各アイテムは独自のメモリホギング ListBoxItemオブジェクトを取得します。この問題は、ListBoxをコンテナ内に配置するときに発生します。 は、サイズを制限しようとしません。たとえば、 をGridの代わりにStackPanelにポップすると、同じ問題が発生します。
  2. リストのコントロールテンプレートを変更してItemsPresenterを使用できない: ItemsPresenterは、 VirtualizingStackPanelを指定するItemsPanelTemplateを使用します。この関係を破ったり、 ItemsPanelTemplateを自分で変更してVirtualizingStackPanelを使用しないと、仮想化機能 が失われます。
  3. データバインディングを使用していない場合:リストをプログラムで入力する場合は、例えば などのListBoxItemオブジェクトを動的に作成することで、リストアを行う場合は、 仮想化は行われません。もちろん、自分が必要とするオブジェクトだけを作成し、必要なときには に作成するなど、独自の最適化手法を使用することもできます。
+0

#1は関連性があるようですが、どのように解決できるかわかりません。 ScrollViewerの高さを{{TemplateBinding Height}}に設定しようとしましたが(ScrollViewer内のグリッドでも同じですが)、運がありません。 #2についてはItemsPresenterを使用していますが、ItemsPanelTemplateを@ d.moncadaとして明示的に設定しようとしましたが、まだ運がありません。私は#3に同意しなければならない。 ItemsSourceがプログラムによって生成された場合でも、仮想化の有無にかかわらず、その違いを明確に見ることができます。仮想化がオフの場合でも、ウィンドウはロードされません。 –

関連する問題