2017-09-01 23 views
-1

長いページにScrollViewer(Webページなど)があります。ItemsControlのXAML仮想化

ページには、遅延読み込みの無限スクロールコンテンツのヘッダーとリストが含まれています。ヘッダーはリストの内容でスクロールする必要があります。ヘッダーの高さはリスト項目の高さの5倍です。

これを仮想化する良い方法はありますか?

私が試した何
<ScrollViewer> 
    <StackPanel> 
     <TextBlock Text="Header:" /> 
     <StackPanel Orientation="Horizontal" Height="500"> 
      <!--Complex UI--> 
     </StackPanel> 

     <TextBlock Text="Videos:"/> 
     <ItemsControl ItemsSource="{Binding Videos}" 
         ItemsTemplate="{StaticResource VideoDataTemplate}" /> 
    </StackPanel> 
</ScrollViewer> 

  1. をヘッダ/リスト項目のDataTemplateSelectorを作成し、1 ItemsControlにすべてをかけます。 理由: スクロールビューアーCanContentScroll="True"スクロールヘッダーを最初のスクロールダッシュでスクロールします。ヘッダーが大きすぎるため、これは受け入れられません。
  2. 2つを作るScrollViewers。 1つはヘッダーのマージンが大きいもの、もう1つはヘッダーの高さがマージンのものです。 理由:トップオフセットとマウスイベントを同期させるのが難しい。
+1

ItemsControlのVirtualizingPanel.ScrollUnitプロパティをPixelに設定し、最初の方法を使用するとどうなりますか? – mm8

+0

私はその解決策で空のプロジェクトを作成しました。それは超不安定で、少し下にスクロールするとクラッシュする。アイテムの高さが異なるためです。ここに要点があります:https://gist.github.com/Mikolaytis/82e739aa6adaea328d5369bf3132f016 – Mikolaytis

+0

私は空のプロジェクトを作ったと言いました!私は要点へのリンクを付けました。私は要点コメントにクラッシュの詳細を添付しました。空のプロジェクトを作成し、要点コードをコピーして試すことができます。または、ここからプロジェクトをダウンロードしてテストしてください:https://drive.google.com/open?id=0B38_Y0INL95-NzFEejk1Vi1LV2s – Mikolaytis

答えて

0

私は驚くべきことでは解決策が見つかりました:HierarchicalDataTemplateTreeViewの仮想化を使用すること。

<TreeView ItemsSource="{Binding VideosViewModel}" 
      ScrollViewer.VerticalScrollBarVisibility="Visible" 
      VirtualizingStackPanel.IsVirtualizing="True" 
      VirtualizingStackPanel.IsVirtualizingWhenGrouping="True" 
      VirtualizingStackPanel.ScrollUnit="Pixel" 
      VirtualizingStackPanel.VirtualizationMode="Recycling"> 
    <TreeView.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel /> 
     </ItemsPanelTemplate> 
    </TreeView.ItemsPanel> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="IsExpanded" Value="True" /> 
     </Style> 
    </TreeView.ItemContainerStyle> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Videos}"> 

      <!--Header--> 
      <StackPanel Orientation="Horizontal" Height="500"> 
       <!--Complex UI--> 
      </StackPanel> 

      <!--Items--> 
      <HierarchicalDataTemplate.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Name, Mode=OneTime}" /> 
       </DataTemplate> 
      </HierarchicalDataTemplate.ItemTemplate> 

     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

このソリューションは安定しており、高速です。

関連する問題