4

在我正在开发的 Windows Phone 7.5 应用程序中,我遇到了一些性能问题。我有一个ListBox正在使用VirtualizationMode="Recycling"的和一个DataTemplate. 除了性能不佳之外,它似乎工作正常。在进行一些性能分析时,我看到,当我滚动列表时,多达 62% 的 CPU 被用于创建我放置在DataTemplate. 我理解的重点VirtualizationMode="Recycling"是重新使用所有的UIElementsListBox而不需要创建新的实例或处理旧的实例,所以我希望这正是不应该发生的事情。

这是相关的 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

4

1 回答 1

1

这很难测试,因为您没有提供有关用户控件的任何信息。

我建议远离 a ,ListBox因为您在此处尝试模拟的行为实际上是WrapPanel

由于您向每个ListBox项目添加如此多的用户控件的方式,我猜它会导致性能下降。如果您切换到 aWrapPanel然后绑定到您的项目集合,您可能会获得更好的性能,因为每个项目都将被虚拟化,而不必尝试一次虚拟化六个项目(这可能不起作用)。

编辑:查看您的代码,我认为您可以进行一些更改以提高性能。首先,摆脱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_1PartText_2变量类型。只需创建一个项目列表,并ItemsControl在您的其他项目控件中添加另一个。

只是摆脱ListBox它使它变得更加顺畅。我还删除了它,VirtualizingStackPanel.VirtualizationMode="Recycling"因为它在开始时会导致性能下降,一旦加载它看起来更流畅。

于 2012-12-20T21:38:34.623 回答