Форма Xamarin: автоматическая прокрутка для детей CarouselPage - PullRequest
0 голосов
/ 18 марта 2020

У меня есть 4 дочерних элемента (страница 1, страница 2, страница 3 и страница 4) в CarouselPage, мне нужно автоматически прокручивать детей каждые 3 секунды. Сначала страница1 отображается в пользовательском интерфейсе, затем страница2 -> страница3 -> страница 4, снова начиная со страницы1.

Я сделал, как показано ниже для этой функции, используя OnCurrentPageChanged () и ожидайте 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 сек c) на экране появляется следующая страница. Если я пролистываю страницу вручную, мне нужно подождать на странице 3 секунды. Как я могу решить эту проблему?

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Есть увлекательная библиотека CardsView , пожалуйста, посмотрите на нее.

это не только решит вашу проблему, но и ваши приложения будут выглядеть круто.

вот источник Project, https://github.com/AndreiMisiukevich/CardView.

проверить CarouselSampleXamlView в этом, SlideShowDuration свойство для карусели, которая обрабатывает все вещи.

Надеюсь, что это помогает.

0 голосов
/ 18 марта 2020

Пожалуйста, не переводите страницу переноса в метод 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
        });

    }
  }

Если вы измените страницу с помощью пальца, задержка не уменьшается. enter image description here

Однако, если вы хотите подождать на странице в течение 3 секунд после считывания. Вы должны использовать пользовательский рендер для достижения этого. Вы должны отслеживать onTouchEvent в пейджере в android (но я не могу найти решение в 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");

        }

    }
}

CarouselPage_CurrentPageChanged метод

       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];
            }
        }

...