在ListBox的末尾添加一个Load More按钮而不会丢失虚拟化?

时间:2011-12-13 12:47:50

标签: silverlight windows-phone-7 listbox windows-phone-7.1

我知道通过编辑ListBox这样的默认样式,我可以在Button的最后添加ListBox

<ScrollViewer x:Name="ScrollViewer" ...> 
    <StackPanel>
        <ItemsPresenter />
        <Button />
    </StackPanel>
</ScrollViewer> 

然而,这样做会破坏ListBox的虚拟化,渲染时间会变得很长。

我能想到的只是,

  1. 创建一个虚拟项目并将其添加到我的项目集合的末尾 viewmodel,在虚拟对象中有一个名为 ButtonGridVisibility Visibility属性,并将其设置为Visibility.Visible
  2. 在我的ListBox ItemTemplate中,有两个Grids。一显示 正常的项目布局,另一个显示加载更多 Button。 然后根据 ButtonGridVisibility 属性切换Visibility
  3. 这可能会有效,但我只是想知道是否有更简单/更好的方法?

2 个答案:

答案 0 :(得分:3)

我知道这是一个老帖子,但万一有些人偶然发现了这个:

有一个LongListSelector控件available out of the box in WP8或作为WP7的Windows Phone Toolkit的一部分,它非常巧妙地支持这种情况。如果要在最后一个项目之后(或在第一个项目之前)添加特定内容,则只需设置控件的ListFooter或ListHeader即可。您可以在其中放置任何内容,这些内容将与其他项目一起滚动。

因此,对于WP7,这将是这样的:

<toolkit:LongListSelector ItemsSource="{Binding Items}">
    <toolkit:LongListSelector.ListFooter>
        <Grid>
            <Button />
        </Grid>
    </toolkit:LongListSelector.ListFooter>
</toolkit:LongListSelector>

其中toolkitxmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"

答案 1 :(得分:1)

现在有很多额外的功能可以帮助解决这个问题。其中之一是在ScrollViewer上增加了“Horizo​​ntalCompression”和“VerticalCompression”视觉状态组,增加了额外的视觉状态。通过使用这些并挂钩CurrentStateChanging事件,您可以根据需要加载更多项目。

有关如何实现此问题的详细信息,请参阅Silverlight for Windows Phone Performance Team Blog.