使用ScrollViewer修饰项目集合控件时,性能似乎有所下降。在我正在处理的特定应用程序中,当我使用ScrollViewer装饰VirtualizingStackPanel时,应用程序似乎受到了很大的打击。我试图在这个特定的容器中加载250个项目,希望用户可以滚动浏览所有250个项目。有人可以对ScrollViewer的内部结构有所了解吗?为什么它的包含可以减慢应用程序的初始负载?
<ScrollViewer
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto"
Visibility= "Visible">
<ListView ItemsSource="{Binding EmployeeAccounts}">
<ListView.ItemsPanel >
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
</ScrollViewer>
由于
答案 0 :(得分:6)
第一件事:您是否尝试使用平滑滚动?如果是这样,您将禁用虚拟化,并且您需要使用逐项滚动(CanContentScroll = true)。
另外,你在物品控制中使用它吗?如果没有,你需要自己动手,因为VirtualizingStackPanel可以与托管它的itemscontrol一起使用。
最后,您使用的是数据分组吗?如果是这样,你再次失去运气。
除了这三件事之外,在项目控件中使用virtualizingstackpanel应该没有问题滚动。请注意,UI Virtualization和Data Virtualization之间存在差异 - 请查看Bea Stollnitz's blog中的这两个条目以获取一些有用的信息。
答案 1 :(得分:2)
你的问题是,为了知道屏幕上真正有哪些项目,VirutalizingStackPanel必须与ScrollViewer进行交互,这只有在VirtualizingStackPanel和ScrollViewer位于同一控件内时才有效。
这就是为什么如果你使用内置滚动的ListView(面板和ScrollViewer都在同一个控件内),这是有效的,但如果你用一个ScrollViewer包装ListView(面板在控件内部,这不起作用, ScrollViewer在外面。)
将ListView(或任何其他ItemsControl)放入ScrollViewer中会取消虚拟化。