Windows Phone Longlistselector ItemsSource Performance



我正在为Windows Phone (Silverlight WP 8.0)开发一个包含三个LongListSelectors的自定义UserControl应用程序。这个UserControl位于全景视图中。当从第一个列表中选择了一个项目时,用户控件将改变第二个列表的视觉状态,并将其动画化,第三个列表也是如此。我遇到的问题是在更改列表的ItemsSource(显式地或通过绑定)和项目的实际呈现之间的加载时间很长。对于大约20个项目的列表,时间至少为500ms,有时超过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实例列表——没有进行其他处理,所以这不应该是任何形式的性能消耗。但是渲染仍然有很大的延迟。

我在我的视觉状态变化中关闭了过渡,但无济于事;列表加载时间仍然太长。我还尝试在全景图中创建一个带有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; }
}

为什么使用LongListSelector ?你看过这个吗?我的意思是,如果项目的数量是固定的,你不使用分组,应该足够使用ListBox。你试过吗?

最新更新