封装在ScrollViewer中时,LongListSelector的性能非常糟糕

时间:2013-01-18 21:41:01

标签: performance xaml windows-phone-8 longlistselector

我有一个UserControl需要在顶部包含一堆控件,在它们下方需要LongListSelector。整个UserControl的总高度可能(并且几乎总是会)超过屏幕高度,在这种情况下,整个UserControl必须可滚动。

我目前的设置如下:

<staff:UserContentControl 
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:controls="clr-namespace:MyApp.Controls"
    xmlns:staff="clr-namespace:MyApp.Helpers"
    x:Class="MyApp.Controls.RemoteHomePage"

    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}">

    <ScrollViewer>
        <ScrollViewer.Content>
            <StackPanel>
                <TextBlock Txt="Text1" Sign="@" />
                <TextBlock Txt="Text2" Sign="#" />
                <controls:Divider />

                <TextBlock Txt="Text3" Sign="~" />
                <TextBlock Txt="Text4" Sign="~" />
                <controls:TextDivider Text="Divider text" />

                <phone:LongListSelector ItemsSource="{Binding Items}">
                    <phone:LongListSelector.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Title}" />
                        </DataTemplate>
                    </phone:LongListSelector.ItemTemplate>
                </phone:LongListSelector>
            </StackPanel>
        </ScrollViewer.Content>
    </ScrollViewer>
</staff:UserContentControl>

这个解决方案满足了我的需求,但也存在一个很大的问题:当它包含的项目数量相当大时,当前LongListSelector需要花费很多时间来加载。处理300个项目需要8秒钟,在此期间整个UI都被阻止。如果删除LongListSelector以外的所有内容,请执行以下操作:

<staff:UserContentControl 
    ...>

    <phone:LongListSelector ItemsSource="{Binding Items}">
        <phone:LongListSelector.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Title}" />
            </DataTemplate>
        </phone:LongListSelector.ItemTemplate>
    </phone:LongListSelector>
</staff:UserContentControl>

然后LongListSelector几乎立即加载,即使项目数量明显增加。但显然我需要上面的其他控件,所以问题是我能解决这个问题吗?

(还有一个相关的问题:我担心LongListSelector内的ScrollViewer会导致双重滚动或类似的事情,但最终在这方面一切都很好。我不确定是否{{ 1}}以某种方式知道它在其他可滚动控件内部或者是否有其他事情发生我不知道。有些解释为什么它工作得很好,虽然速度很慢,但我会非常感激。)

2 个答案:

答案 0 :(得分:13)

不要使用滚动查看器,因为它会使长列表选择器认为它具有可用的无限高屏幕并呈现其所有项目。 而是要解决您的用例,请使用页眉和页脚属性在列表项的上方或下方添加数据。

答案 1 :(得分:1)

您不能强制ScrollViewer虚拟化LongListSelector项。

所以你需要通过LongListSelector来模仿它的行为。

使第一个项目包含StackPanel所需的所有元素(1'st itemtemplate)。而其他元素将是基本的LongListSelector元素(2'nd itemtemplate)。

以下是如何为项目设置不同模板的说明:Styling a selected ListViewItem in Windows 8 CP