当LongListSelector被包含在ScrollViewer中时,性能非常差

5
我有一个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秒钟,在此期间整个用户界面都会被阻塞。如果我将其他所有内容都删除,只留下 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加载几乎立即完成,即使有大量的项目。但是显然我需要它上面的其他控件,所以问题是我该怎么解决这个问题?
(另一个相关的问题:我担心ScrollViewer内部的LongListSelector可能会导致双重滚动或类似的问题,但最终在这方面一切都很好。我不确定LongListSelector是否知道它在其他可滚动控件中,或者是否发生了我不知道的其他事情。如果能解释为什么它能正常工作,尽管非常缓慢,那将不胜感激。)

1
你做错了。 - Mathias Lykkegaard Lorenzen
@MathiasLykkegaardLorenzen :) - src091
2个回答

13

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


1

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

因此,您需要通过仅使用LongListSelector来模仿它的行为。

使第一个项目包含所有您从StackPanel中所需的元素(第一个itemtemplate)。其他元素将是基本的LongListSelector元素(第二个itemtemplate)。

这里解释了如何为项目设置不同的模板:在Windows 8 CP中设置选定的ListViewItem的样式


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接