首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ListBox、VirtualizingStackPanel和WPF中的平滑滚动

ListBox、VirtualizingStackPanel和WPF中的平滑滚动
EN

Stack Overflow用户
提问于 2009-12-18 03:44:48
回答 3查看 21.4K关注 0票数 21

我有一个ListBox,它可能有很多行模板化的DB记录,包括一个绑定到ObservableCollection<MyItem>Image。有时,集合可以容纳数千个项目。

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-18 04:46:53

当您取消选中CanContentScroll时,您将执行lose virtualization。答案真的很令人沮丧:目前还没有现成的解决方案:

PS:这不是第一篇问this very question的帖子。

票数 11
EN

Stack Overflow用户

发布于 2015-11-02 21:47:14

如果你使用.NET 4.5 (或者4.0,如果你愿意修改一下),那么有一个答案是over here

请注意,@Guilluame的评论早在这个答案之前就在这里了,但在浏览答案时并不是特别明显。

票数 5
EN

Stack Overflow用户

发布于 2021-11-23 15:02:52

对于搜索2021的任何人,您可以使用这样的解决方案:

您将同时保持滚动和虚拟化

代码语言:javascript
复制
            <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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1924089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档