Как отключить прокрутку страницы Карусель в Android - PullRequest
1 голос
/ 05 апреля 2019

Используя пользовательский рендер, можно отключить жест смахивания CarouselPage на iOS, например, так:

using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(CarouselPage), typeof(CustomCarouselPageRenderer))]
namespace App.iOS
{
    public class CustomCarouselPageRenderer : CarouselPageRenderer
    {
        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);

            UIView view = this.NativeView;
            UIScrollView scrollView = (UIKit.UIScrollView)view.Subviews[0];
            scrollView.ScrollEnabled = false;
        }
    }
}

Как сделать то же самое на Android?

using Android.Content;
using XamFormsApp.Droid.Renderers;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(CarouselPage), typeof(CustomCarouselPageRenderer))]
namespace StixApp.Droid.Renderers
{
    public class CustomCarouselPageRenderer : VisualElementRenderer<CarouselPage>
    {
        public CustomCarouselPageRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<CarouselPage> e)
        {
            base.OnElementChanged(e);
            var view = this.RootView;
            X
            X
        }
    }
}

Похоже, что нет доступа к Subviews таким же образом. Можно получить доступ к Children, как это так

Android.Views.View view = (Android.Views.View)GetChildAt(i);

Как узнать, какой Child является ScrollView, если есть?

Использование цикла для проверки этого, например,

for (int i = 0; i < ChildCount; ++i)
{
    Android.Views.View view = (Android.Views.View)GetChildAt(i);
    if (view is ScrollView)
    {
    }
}

Выводит следующее: " Данное выражение никогда не относится к указанному (ScrollView) типу "

Так! Как отключить CarouselPage пролистывание / прокрутку, как это сделано в iOS довольно элегантно?

ОБНОВЛЕНИЕ : см. образец решения .

1 Ответ

1 голос
/ 05 апреля 2019

Пара вещей.

Для Android искомый вид - это не ScrollView, а ViewPager.

Это можно найтипод индексом 0 с помощью метода GetChildAt .

Кроме того, почему вы используете VisualElementRenderer<CarouselPage> в качестве родительского класса вашего CustomCarouselPageRenderer.Вместо этого используйте CarouselPageRenderer, как вы это делали с iOS.

И последнее: на 1018 * Android прокрутка ViewPager не может быть отключена.Чтобы получить такое поведение, вы можете прослушать событие Touch .Установка свойства Handled для TouchEventArgs в true предотвратит прокрутку.

Весь ваш класс будет выглядеть примерно так:

[assembly: ExportRenderer(typeof(CarouselPage), typeof(CustomCarouselPageRenderer))]
namespace StixApp.Droid.Renderers
{
    public class CustomCarouselPageRenderer : CarouselPageRenderer
    {
        private bool _canScroll = false;

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

        public CustomCarouselPageRenderer()
        {
        }

        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)
        {
            e.Handled = !_canScroll;
        }
    }
}

Просто измените значение _canScroll на true, чтобы разрешить прокрутку.

Надеюсь, это поможет .-

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...