ScrollViewer的性能问题

时间:2010-08-18 20:59:08

标签: .net wpf xaml clr scrollviewer

使用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>

由于

2 个答案:

答案 0 :(得分:6)

第一件事:您是否尝试使用平滑滚动?如果是这样,您将禁用虚拟化,并且您需要使用逐项滚动(CanContentScroll = true)。

另外,你在物品控制中使用它吗?如果没有,你需要自己动手,因为VirtualizingStackPanel可以与托管它的itemscontrol一起使用。

最后,您使用的是数据分组吗?如果是这样,你再次失去运气。

除了这三件事之外,在项目控件中使用virtualizingstackpanel应该没有问题滚动。请注意,UI VirtualizationData Virtualization之间存在差异 - 请查看Bea Stollnitz's blog中的这两个条目以获取一些有用的信息。

答案 1 :(得分:2)

你的问题是,为了知道屏幕上真正有哪些项目,VirutalizingStackPanel必须与ScrollViewer进行交互,这只有在VirtualizingStackPanel和ScrollViewer位于同一控件内时才有效。

这就是为什么如果你使用内置滚动的ListView(面板和ScrollViewer都在同一个控件内),这是有效的,但如果你用一个ScrollViewer包装ListView(面板在控件内部,这不起作用, ScrollViewer在外面。)

将ListView(或任何其他ItemsControl)放入ScrollViewer中会取消虚拟化。