具有连续填充的ListView不是虚拟化

时间:2011-12-06 11:26:48

标签: wpf performance templates listview controls

我将ListView的控件模板更改为:

<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
    <ScrollViewer Background="{TemplateBinding Background}"
                      VerticalScrollBarVisibility="Auto"
                      Padding="{TemplateBinding Padding}" Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}"
                  VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling"
                  ScrollViewer.IsDeferredScrollingEnabled="True">
        <StackPanel>
            <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
            <Border x:Name="FillerView" BorderThickness="0"/>
        </StackPanel>

    </ScrollViewer>
</Border>

原因是,我希望ListView的交替着色继续。这是通过FillerView边界的触发器完成的。如果我从此模板中删除Stackpanel和边框Fillerview,则ListView正常且非常快速地进行虚拟化。如果我在那里有它非常慢。

当我使用上面的模板时,有谁可以告诉我为什么虚拟化不起作用?哦,我无法将FillerView移出Scrollviewer,因为我希望底部滚动条位于填充区下方。

谢谢!

1 个答案:

答案 0 :(得分:2)

虚拟化不起作用,因为虚拟化要求使用实际可用大小来测量ItemsPresenter的ItemsPanel。在您的情况下,您有一个StackPanel作为ScrollViewer的内容,它将是ScrollViewer的IScrollInfo。现在因为StackPanel在排列方向上测量其无穷大的子项,这意味着它将测量具有无限高度的ItemsPresenter,因此ItemsPanel(可能是ItemsPresenter的子项)无法知道实际可用高度所以它无法虚拟化。

我不确定你对listview的交替着色是什么意思。如果您正在讨论列表视图中项目的交替背景,那么通常会使用AlternationConverter