【发布时间】:2012-12-20 14:19:19
【问题描述】:
我在正在开发的 Windows Phone 7.5 应用程序中遇到了一些性能问题。我有一个使用VirtualizationMode="Recycling" 的ListBox 和一个DataTemplate。除了性能不佳之外,它似乎工作正常。在进行一些性能分析时,我看到,当我滚动列表时,多达 62% 的 CPU 被用于创建我放在 DataTemplate 中的自定义用户控件的新实例。我理解VirtualizationMode="Recycling" 的全部意义在于重新使用ListBox 中的所有UIElements,而不需要创建新实例或处理旧实例,所以我希望这正是不应该发生的事情正在发生。
这里是相关的 XAML:
<ListBox ItemsSource="{Binding EpisodeRows}" toolkit:TiltEffect.SuppressTilt="True" Margin="12,0" VirtualizingStackPanel.VirtualizationMode="Recycling">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid VerticalAlignment="Top" Height="111" VirtualizingStackPanel.VirtualizationMode="Recycling" >
<StackPanel Orientation="Horizontal" Visibility="{Binding TilesVisibility}">
<landerGame:LevelTileUserControl PartText="{Binding PartText_1}" ScoreText="{Binding ScoreText_1}" Star1Visibility="{Binding Star1Vi
<landerGame:LevelTileUserControl PartText="{Binding PartText_2}" ScoreText="{Binding ScoreText_2}" Star1Visibility="{Binding Star1Vi
<landerGame:LevelTileUserControl PartText="{Binding PartText_3}" ScoreText="{Binding ScoreText_3}" Star1Visibility="{Binding Star1Vi
<landerGame:LevelTileUserControl PartText="{Binding PartText_4}" ScoreText="{Binding ScoreText_4}" Star1Visibility="{Binding Star1Vi
<landerGame:LevelTileUserControl PartText="{Binding PartText_5}" ScoreText="{Binding ScoreText_5}" Star1Visibility="{Binding Star1Vi
<landerGame:LevelTileUserControl PartText="{Binding PartText_6}" ScoreText="{Binding ScoreText_6}" Star1Visibility="{Binding Star1Vi
</StackPanel>
<TextBlock VerticalAlignment="Top" Text="{Binding EpisodeTitleText}" Style="{StaticResource PhoneTextExtraLargeStyle}" Margin="0,0,0,5"
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
这是我在滚动列表时的性能分析结果的屏幕截图:
列表如下所示(这是游戏的关卡选择):
我环顾四周,发现任何针对VirtualizationMode="Recycling" 的文章似乎都不起作用。在这一点上,任何见解都将不胜感激。
编辑:我已经上传了该项目的完整相关代码,任何人都想在这里亲自尝试一下:http://maketag.net/landerGame.rar
【问题讨论】:
-
电话我忘了,但你是否必须声明 VirtualizingStackPanel.IsVirtualizing="True" 可能吗?
-
@ChrisW。我试了一下,但
IsVirtualizing在 WP7 XAML 中不可设置 =(. -
哦,我想我看到了您的问题,放弃嵌套网格上的虚拟化,将其保留在列表框本身上。然后在列表框上设置一个固定的高度值。如果你不这样做,渲染引擎只是认为它有无限的空间,并且实际上不会调用虚拟化。这是我最近自己学到的东西,哈哈。那你应该很好,试一试。
-
@ChrisW 我试了一下,但不高兴 =(。仍然获得完全相同的缓慢性能和大量 CPU 时间用于在滚动时初始化新的 LevelTileUserControl 实例。不过感谢您的建议。
-
只是想知道你为什么在这里使用 ListBox?似乎有更好的布局选项可以为您提供更好的性能。
标签: c# windows-phone-7 xaml windows-phone-7.1