gpt4 book ai didi

wpf - 连续填充的 ListView 未虚拟化

转载 作者:行者123 更新时间:2023-12-04 14:02:04 25 4
gpt4 key购买 nike

我将 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 将正常且非常快速地虚拟化。如果我有它,它会非常慢。

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

谢谢!

最佳答案

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

我不确定您所说的 ListView 的交替着色是什么意思。如果您谈论的是 ListView 中项目的交替背景,那么通常会使用 AlternationConverter .

关于wpf - 连续填充的 ListView 未虚拟化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8399159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com