2010-11-29 1 views
2

Visibilityプロパティを公開できる数百の要素を持つListViewのUI仮想化に問題があります。ListView、ListViewItems、Virtualization

残念ながら、仮想化では視認性が正しく認識されず、スクロールバーの位置は、ViewPort内のアイテムの数に応じて小さくなります(ViewPortでは折りたたまれていないアイテムの数ではありません)。

仮想化をオフにすることなくこの問題を回避する方法はありますか?仮想化の

<ListView VerticalAlignment="Stretch" 
      Name="ListViewControl" 
      HorizontalAlignment="Stretch" 
      ItemsSource="{Binding Movies}" 
      ScrollViewer.VerticalScrollBarVisibility="Visible" 
      SelectedItem="{Binding MovieSelected, Mode=OneWayToSource}"> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="ListViewItem"> 
      <EventSetter Event="MouseDoubleClick" Handler="ItemClicked" /> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
      <Setter Property="Visibility" Value="{Binding Visibility}"/> 
     </Style> 
    </ListView.ItemContainerStyle> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <Grid HorizontalAlignment="Stretch"> 

      </Grid> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

答えて

2

ポイントは、UIは、右、コレクション内のすべての項目を検討することなく、レンダリングできるということです。

例は添付資料参照してください?しかし、あなたが望む結果はちょうどそれに依存しています - スクロールバーは、目に見えるアイテムの数を知らなくてもサムのサイズを正確に計算することができず、それを行うためには各アイテムを見なければなりません。仮想化がオンになっていると、スクロールバーはすべての項目を調べず、コレクション内の項目数を推定値として使用します。

表示したくないアイテムを折りたたむ代わりに、アイテムソースからアイテムを削除すると効果的です。 CollectionViewを使用し、VisibilityVisibility.Collapsedであるアイテムを除外します。ビューに表示する必要があるかどうかを判断するために基本コレクション内の各アイテムを訪問するコストはまだかかりますが、コレクション内の項目の上流でUIで実際にレンダリングされる場合はおそらくかなり速くなります。

関連する問題