我有一个ListBox,它可能有很多行模板化的DB记录,包括一个绑定到ObservableCollection<MyItem>的Image。有时,集合可以容纳数千个项目。
性能很好,但滚动是默认的跳跃行为。我想让它有平滑的滚动,所以我取消选中ScrollViewer.CanContentScroll。
现在我有了平滑的滚动,但性能非常糟糕:数据在单独的线程中检索,线程很快结束,但结果在ListBox中显示需要10-20秒。我假设这是因为取消选中ScrollViewer.CanContentScroll会将底层VirtualizingStackPanel更改为常规StackPanel,因此它会在显示结果之前加载整个集合。
所以我的问题是:我如何在不牺牲VirtualizingStackPanel行为和性能的情况下保持平滑的滚动?
发布于 2009-12-18 04:46:53
当您取消选中CanContentScroll时,您将执行lose virtualization。答案真的很令人沮丧:目前还没有现成的解决方案:
PS:这不是第一篇问this very question的帖子。
发布于 2015-11-02 21:47:14
如果你使用.NET 4.5 (或者4.0,如果你愿意修改一下),那么有一个答案是over here。
请注意,@Guilluame的评论早在这个答案之前就在这里了,但在浏览答案时并不是特别明显。
发布于 2021-11-23 15:02:52
对于搜索2021的任何人,您可以使用这样的解决方案:
您将同时保持滚动和虚拟化
<ItemsControl x:Name="TestIC" Grid.Row="1"
ScrollViewer.CanContentScroll="True"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.VirtualizationMode="Recycling" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Template>
<ControlTemplate>
<Border
Padding="{TemplateBinding Control.Padding}"
Background="{TemplateBinding Panel.Background}"
BorderBrush="{TemplateBinding Border.BorderBrush}"
BorderThickness="{TemplateBinding Border.BorderThickness}"
SnapsToDevicePixels="True">
<ScrollViewer Padding="{TemplateBinding Control.Padding}" Focusable="False">
<ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
</ScrollViewer>
</Border>
</ControlTemplate>
</ItemsControl.Template>
</ItemsControl>https://stackoverflow.com/questions/1924089
复制相似问题