我将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
,因为我希望底部滚动条位于填充区下方。
谢谢!
答案 0 :(得分:2)
虚拟化不起作用,因为虚拟化要求使用实际可用大小来测量ItemsPresenter的ItemsPanel。在您的情况下,您有一个StackPanel作为ScrollViewer的内容,它将是ScrollViewer的IScrollInfo。现在因为StackPanel在排列方向上测量其无穷大的子项,这意味着它将测量具有无限高度的ItemsPresenter,因此ItemsPanel(可能是ItemsPresenter的子项)无法知道实际可用高度所以它无法虚拟化。
我不确定你对listview的交替着色是什么意思。如果您正在讨论列表视图中项目的交替背景,那么通常会使用AlternationConverter。