Xamarin.forms Xamarin表单:用于CarouselPage子级的自动滚动

Xamarin.forms Xamarin表单:用于CarouselPage子级的自动滚动,xamarin.forms,carousel,autoscroll,Xamarin.forms,Carousel,Autoscroll,我有4个孩子(第1页、第2页、第3页和第4页)在旋转木马页面中,我需要每3秒钟自动滚动孩子。最初,page1显示在UI上,然后page2->page3->Page4再次从page1开始 我使用OnCurrentPageChanged()和wait Task.Delay(TimeSpan.FromSeconds(3))完成了如下功能:: protected async override void OnCurrentPageChanged() { base.OnCurrentPageChan

我有4个孩子(第1页、第2页、第3页和第4页)在旋转木马页面中,我需要每3秒钟自动滚动孩子。最初,page1显示在UI上,然后page2->page3->Page4再次从page1开始

我使用OnCurrentPageChanged()和wait Task.Delay(TimeSpan.FromSeconds(3))完成了如下功能::

protected async override void OnCurrentPageChanged()
{
    base.OnCurrentPageChanged();
    await Task.Delay(TimeSpan.FromSeconds(3));
    int index = Children.IndexOf(CurrentPage);
    if (index == 0)
    {
        CurrentPage = Children[1];
    }
    else if (index == 1)
    {
        CurrentPage = Children[2];
    }
    else if (index == 2)
    {
        CurrentPage = Children[3];
    }
    else if (index == 3)
    {
        CurrentPage = Children[0];
    }
}
通过这种方法,自动滚动是成功的


但是如果我在自动滚动之间手动滚动页面,则延迟会减少。突然(不到3秒)下一页显示在屏幕上。如果我手动滑动页面,我需要在页面上等待3秒钟。如何解决此问题?

有一个令人兴奋的库CardsView请查看它

它不仅可以解决您的问题,而且您的应用程序看起来也很酷

这里是源项目

选中CarouselSamplexamView中处理所有内容的carousel的SlideShowDuration属性


希望能有所帮助。

请不要将传输页面放在
OnCurrentPageChanged
方法中

您可以将其放入页面的构造函数中

 public partial class MainPage : CarouselPage
{

    bool isStart = true;
    public MainPage()
    {
        InitializeComponent();

        Device.StartTimer(new TimeSpan(0, 0, 3), () =>
        {

            Device.BeginInvokeOnMainThread(() =>
            {
                int index = Children.IndexOf(CurrentPage);
                if (index == 0)
                {
                    CurrentPage = Children[1];
                    isStart = true;
                }
                else if (index == 1)
                {
                    CurrentPage = Children[2];
                    isStart = true;
                }
                else if (index == 2)
                {
                    CurrentPage = Children[3];
                    isStart = true;
                }
                else if (index == 3)
                {
                    CurrentPage = Children[0];
                    isStart = true;
                }
            });
            return isStart; // runs again, or false to stop
        });

    }
  }
如果您通过滑动来更改页面,则延迟不会减少。

但是,如果您想在刷卡后在页面上等待3秒钟。您必须使用自定义渲染器来实现它。您应该在android中监视viewpager的
onTouchEvent
(但我在IOS中找不到解决方案)。这种方式将有卡顿,所以上述方式将更好

[assembly: ExportRenderer(typeof(CarouselPage), typeof(CustomCarouselPageRenderer))]
namespace CarouselPageDemo.Droid
{
    public class CustomCarouselPageRenderer: CarouselPageRenderer
    {

        public CustomCarouselPageRenderer(Context context) : base(context) { 

        }

        protected override void OnElementChanged(ElementChangedEventArgs<CarouselPage> e)
        {
            base.OnElementChanged(e);

            if (this.ChildCount > 0 && this.GetChildAt(0) is ViewPager viewPager)
            {
                viewPager.Touch -= ViewPagerTouched;
                viewPager.Touch += ViewPagerTouched;

            }


        }

        private void ViewPagerTouched(object sender, TouchEventArgs e)
        {

           MessagingCenter.Send<App, string>(App.Current as App, "OpenPage", "stop");

        }

    }
}

您需要滚动页面或视图吗?如果您需要滚动视图(通过autoscroll功能用户正在寻找的猜测),那么我发现CarousePage的使用是一种过火的行为。@Nikhileshwar我正在尝试滚动页面,而我的页面是CarouselPageOK的产物。如果我发现任何对你有用的东西,我会在这里发布。
       private async void CarouselPage_CurrentPageChanged(object sender, EventArgs e)
        {
              var   tokenSource = new CancellationTokenSource();
            await Task.Delay(TimeSpan.FromSeconds(3), tokenSource.Token);
            MessagingCenter.Subscribe<App, string>(App.Current, "OpenPage", (snd, arg) =>
            {

                     tokenSource.Cancel();

                });


            int index = Children.IndexOf(CurrentPage);
            if (index == 0)
            {
                CurrentPage = Children[1];
            }
            else if (index == 1)
            {
                CurrentPage = Children[2];
            }
            else if (index == 2)
            {
                CurrentPage = Children[3];
            }
            else if (index == 3)
            {
                CurrentPage = Children[0];
            }
        }