21

我有一个ListBox可能有很多行模板化数据库记录,包括一个Image绑定到一个ObservableCollection<MyItem>. 有时收藏品可以容纳数千件物品。

性能很棒,但滚动是默认的跳跃行为。我希望它有平滑滚动,所以我取消选中ScrollViewer.CanContentScroll.

现在我可以平滑滚动了,但性能却很糟糕:数据是在单独的线程中检索的,线程很快完成,但结果需要 10-20 秒才能显示在ListBox. 我认为这是因为取消选中ScrollViewer.CanContentScroll会将底层更改VirtualizingStackPanel为常规StackPanel,因此它会在显示结果之前加载整个集合。

所以我的问题是:如何在不牺牲VirtualizingStackPanel行为和性能的情况下保持平滑滚动?

4

3 回答 3

11

当您取消选中 CanContentScroll 时,您将失去虚拟化。答案真的很令人沮丧:目前还没有开箱即用的解决方案:(。

PS:这不是这里的第一篇文章,问这个问题

于 2009-12-17T20:46:52.800 回答
5

如果您使用 .NET 4.5(或 4.0,如果您愿意破解一下),那么这里有一个答案

[请注意,@Guillame 的评论在此答案之前就在这里,但在浏览答案时并不是特别明显。]

于 2015-11-02T13:47:14.030 回答
0

对于在 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>
于 2021-11-23T15:02:51.820 回答