📜  Xamarin 表单 CarouselView 不会一一滑动项目 - C# (1)

📅  最后修改于: 2023-12-03 15:35:46.184000             🧑  作者: Mango

Xamarin 表单 CarouselView 不会一一滑动项目 - C#

最近我在使用 Xamarin 表单中的 CarouselView 时遇到了一些问题:它无法按照我的预期一一滑动项目,而是跳过一些项目。在这篇文章中,我将介绍我的解决方案和一些可能有用的技巧。

初步研究

CarouselView 是 Xamarin 表单中的一个轮播控件,可以轻松地实现图片轮播、幻灯片和其他类似的滑动效果。在我的项目中,我使用 CarouserlView 来显示一些视频快照,用户可以向左或向右滑动以获取更多快照。

<CarouselView ItemsSource="{Binding VideoSnapshots}">
  <CarouselView.ItemTemplate>
    <DataTemplate>
      <Image Source="{Binding SnapshotUrl}" />
    </DataTemplate>
  </CarouselView.ItemTemplate>
</CarouselView>

当我第一次运行这个程序时,我很惊讶地发现 CarouserlView 实际上跳过了一些项目。例如,当我向左滑动时,它会跳过一些项目而不是向左滑动每个项目。我想知道这是为什么。

解决方案

经过一些研究和测试,我发现这个问题的原因是速度。如果您滑动 CarouselView 的速度太快,它可能会跳过一些项目。这是因为 CarouselView 工作方式的原理:它在项目之间创建缓存,以便快速滑动。如果您滑动得太快,CarouselView 没有足够的时间来加载缓存的所有项目,因此它跳过一些项目以快速显示当前的项目。

解决这个问题的方法很简单:减慢滑动速度。在我的项目中,我使用了 Xamarin 表单的 ScrollView.ScrollToAsync() 方法来实现这一点。这个方法让我指定了滑动的位置以及滑动的时间:

var currentIndex = VideoSnapshots.IndexOf(SelectedVideoSnapshot);
var newIndex = left ? currentIndex - 1 : currentIndex + 1;
if (newIndex >= 0 && newIndex < VideoSnapshots.Count)
{
  SelectedVideoSnapshot = VideoSnapshots[newIndex];
  var item = CarouselView.GetChildAt(newIndex);
  await scrollView.ScrollToAsync(item, ScrollToPosition.Center, true);
}

通过使用 ScrollView.ScrollToAsync() 方法,我可以确保滑动速度始终是可控的,CarouselView 可以处理所有项目的缓存。

总结

在这篇文章中,我介绍了我在使用 CarouselView 时遇到的问题以及解决方案。如果您在使用 CarouselView 时遇到了类似的问题,请尝试降低滑动速度或使用 ScrollView.ScrollToAsync() 方法来控制滑动。谢谢阅读!