Windows Phone Longlistselector ItemsSource性能

时间:2014-07-13 21:48:40

标签: c# performance silverlight xaml windows-phone-8

我正在开发一个适用于Windows Phone(Silverlight WP 8.0)的应用程序,其中包含一个包含三个LongListSelectors的自定义UserControl。此UserControl位于Panorama内部。当从第一个列表中选择一个项目时,用户控件将更改视觉状态并为第二个列表设置动画,并为第三个列表设置相同的动画。我遇到的问题是更改列表的ItemsSource(显式或通过绑定)和项目的实际呈现之间的长加载时间。使用大约20个项目的列表,时间至少500毫秒,有时超过1秒。这似乎不合理。这是我正在使用的XAML:

MainPage.xaml中:

<phone:Panorama Template="{StaticResource TunrPanorama}">
    <!--Panorama item one-->
    <phone:PanoramaItem Background="White" Style="{StaticResource MusicPanoramaItemStyle}">
        <tunr:LibraryControl DataContext="{Binding}" TrackSelected="LibraryControl_TrackSelected" />
    </phone:PanoramaItem>

LibraryControl.xaml:

<Grid x:Name="LayoutRoot">
    <Grid.RowDefinitions>
        <RowDefinition Height="auto" />
        <RowDefinition />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <StackPanel x:Name="stackPanel" Grid.Row="0" Orientation="Vertical" Height="108">
        <!-- Some headers here -->
    </StackPanel>
    <Grid Grid.Row="1" Margin="12,0,0,0">
        <!-- List number 1 -->
        <phone:LongListSelector Grid.Row="0" Grid.Column="0" x:Name="music_artists" VerticalAlignment="Stretch" ItemsSource="{Binding ArtistList}" SelectionChanged="music_artists_SelectionChanged" RenderTransformOrigin="0.5,0.5">
            <phone:LongListSelector.RenderTransform>
                <CompositeTransform/>
            </phone:LongListSelector.RenderTransform>
            <phone:LongListSelector.ItemTemplate>
                <DataTemplate>
                    <ListBoxItem Margin="0,6,0,6">
                        <StackPanel>
                            <TextBlock Text="{Binding}" TextWrapping="NoWrap" Style="{StaticResource PhoneTextExtraLargeStyle}" FontSize="{StaticResource PhoneFontSizeLarge}" Foreground="Black"/>
                        </StackPanel>
                    </ListBoxItem>
                </DataTemplate>
            </phone:LongListSelector.ItemTemplate>
        </phone:LongListSelector>
        <!-- List number 2 -->
        <phone:LongListSelector Grid.Row="0" Grid.Column="0" x:Name="music_albums" LayoutMode="Grid" GridCellSize="190,190" SelectionChanged="music_albums_SelectionChanged" RenderTransformOrigin="0.5,0.5">
            <phone:LongListSelector.RenderTransform>
                <CompositeTransform/>
            </phone:LongListSelector.RenderTransform>
            <phone:LongListSelector.ItemTemplate>
                <DataTemplate>
                    <ListBoxItem Margin="6,6,6,6">
                        <Grid>
                            <Border Width="178" Height="178" Background="#FF838383" />
                        </Grid>
                    </ListBoxItem>
                </DataTemplate>
            </phone:LongListSelector.ItemTemplate>
        </phone:LongListSelector>
        <!-- List number 3 -->
        <phone:LongListSelector Grid.Row="0" Grid.Column="0" x:Name="music_tracks" SelectionChanged="music_tracks_SelectionChanged">
            <phone:LongListSelector.RenderTransform>
                <CompositeTransform/>
            </phone:LongListSelector.RenderTransform>
            <phone:LongListSelector.ItemTemplate>
                <DataTemplate>
                    <ListBoxItem Margin="0,6,0,6">
                        <StackPanel>
                            <TextBlock Text="{Binding Title}" TextWrapping="NoWrap" Style="{StaticResource PhoneTextExtraLargeStyle}" FontSize="{StaticResource PhoneFontSizeLarge}" Foreground="Black"/>
                        </StackPanel>
                    </ListBoxItem>
                </DataTemplate>
            </phone:LongListSelector.ItemTemplate>
        </phone:LongListSelector>
    </Grid>
</Grid>

以下是填充列表的代码:

(DataContext as LibraryViewModel).SelectAlbum(album).ContinueWith((songs) => {
    Dispatcher.BeginInvoke(() =>
    {
        music_tracks.ItemsSource = songs.Result;
        VisualStateManager.GoToState(this, "Tracks", true);
    });
});

上面的所有SelectAlbum方法现在都返回一个新创建的Song实例的列表 - 没有进行其他处理,所以这不应该是任何类型的性能损失。但渲染仍然存在很大的延迟。

我已经关闭了视觉状态变化的转换,但无济于事;列表仍然需要很长时间才能加载。我还尝试通过在Panorama中创建一个带有LLS的全新项目,按下按钮来查看延迟。这几乎是即时的。它与我的项目之间的唯一区别似乎是UserControl我已经嵌套了这些列表 - 这可能是导致这种糟糕表现的原因吗?

非常感谢任何建议!

为了更好的衡量,这里是我正在渲染的项目的类:

public class SongModel
{
    public Guid SongID { get; set; }
    //public string SongFingerPrint { get; set; }
    public Guid OwnerId { get; set; }
    public string SongMD5 { get; set; }
    public string Title { get; set; }
    public string Artist { get; set; }
    public string Album { get; set; }
    public int TrackNumber { get; set; }
    public int DiscNumber { get; set; }
    public int Year { get; set; }
    public string Genre { get; set; }
    public double Length { get; set; }
}

1 个答案:

答案 0 :(得分:0)

为什么使用LongListSelector?你看过this了吗? 我的意思是,如果项目的数量是固定的而您不使用分组,则应该足以使用ListBox。你试过吗?