我一直在处理我正在处理的Windows Phone 7.5应用程序中的一些性能问题。我有ListBox
使用VirtualizationMode="Recycling"
和DataTemplate
。除了性能不佳外,它似乎工作正常。在进行一些性能分析时,我看到了,当我滚动列表时,正在使用62%的CPU正在创建一个新的自定义用户控件实例,我放在DataTemplate
中。我理解VirtualizationMode="Recycling"
的重点是重用UIElements
中的所有ListBox
而不需要创建新实例或处理旧实例,所以我希望这正是那种不应该发生的事情。
以下是相关的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
答案 0 :(得分:1)
由于您未提供有关用户控件的任何信息,因此很难测试。
我建议远离ListBox
,因为您在此处尝试模拟的行为实际上是WrapPanel。
由于您为每个ListBox
项添加了这么多用户控件的方式,我猜它会导致性能下降。如果您切换到WrapPanel
然后绑定到您的项目集合,您可能会获得更好的性能,因为每个项目都将虚拟化而不必尝试一次虚拟化六个项目(这可能不起作用) 。
编辑:仔细查看代码,我认为您可以进行一些改进以提高性能。首先,摆脱ListBox
并使用ItemsControl
这样:
<controls:Pivot Title="LANDER GAME">
<!--Pivot item one-->
<controls:PivotItem Header="Episodes">
<ScrollViewer>
<ItemsControl ItemsSource="{Binding EpisodeRows}" toolkit:TiltEffect.SuppressTilt="True" Margin="12,0">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid VerticalAlignment="Top" Height="111" >
<StackPanel Orientation="Horizontal" Visibility="{Binding TilesVisibility}">
...
</StackPanel>
<TextBlock VerticalAlignment="Top" Text="{Binding EpisodeTitleText}" Style="{StaticResource PhoneTextExtraLargeStyle}" Margin="0,0,0,5" Visibility="{Binding TitleVisibility}" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</controls:PivotItem>
我要做的就是摆脱硬编码的PartText_1
,PartText_2
类型的变量。只需创建一个项目列表,并在其他项目控件中添加另一个ItemsControl
。
摆脱ListBox
让它变得更加顺畅。我还删除了VirtualizingStackPanel.VirtualizationMode="Recycling"
,因为它在开始时导致了性能损失,一旦加载它看起来更平滑。