我在 WP8 上的 LongListSelector 中显示一组图像,并且我利用 LLS 的 ItemRealized 事件实现了众所周知的延迟加载模式。
在下面的代码中,为 Pictures 集合中的每个项目调用 OnItemRealized - 即使对于明显不在屏幕上的项目也是如此。在这种情况下,屏幕上适合 24 个项目,但 LLS 实现了 40 个项目,这会触发 ViewModel 的 ResumeGetPictures()。当 Pictures 集合发生变化 (INotifyCollectionChanged) 时,LLS 也会意识到这些项目,直到它用完项目,触发下一个 ResumeGetPictures() - 这将一直持续到 ViewModel 无法加载更多项目。
只要 LLS 处于 LayoutMode=List 中,一切似乎都很好。但是当我切换到 Grid 时,控件似乎会吞下列表中的每一项并立即意识到这一点。使任何类型的延迟加载成为不可能。
我希望我只是做了一些非常非常错误的事情-尽管我对此表示怀疑,因为我已经对所有内容进行了三次检查,并且就像我说的切换到“列表”可以立即解决问题-不幸的是,这不是某种照片库的选择。
视图模型:
public IReactiveDerivedList<TPicture> Pictures
{
get { return pictures; }
}
查看代码隐藏:
lls.ItemRealized += OnItemRealized;
private void OnItemRealized(object sender, ItemRealizationEventArgs e)
{
var picture = e.Container.Content as Picture;
if (picture != null)
{
// get index
var pictureIndex = lls.ItemsSource.IndexOf(picture);
if (pictureIndex >= lls.ItemsSource.Count * 0.95f)
ViewModel.ResumeGetPictures();
}
}
XAML:
<phone:LongListSelector Name="lls" Margin="13,-30,0,0"
ItemsSource="{Binding Pictures}"
Tap="OnListItemTapped"
ItemTemplate="{StaticResource ItemTemplate}"
IsGroupingEnabled="False"
LayoutMode="Grid"
GridCellSize="108,108"/>