如何在Android中禁用Carousel Page滚动

问题描述 投票:1回答:1

使用自定义渲染器,可以在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);

如何知道哪个ChildScrollView

使用循环检查这个,像这样,

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

产生以下结果:“给定的表达式永远不是提供的(ScrollView)类型”

所以!如何禁用CarouselPage滑动/滚动,就像在iOS完成一样优雅?

更新:请参阅sample solution

xamarin xamarin.forms xamarin.android carousel renderer
1个回答
1
投票

有几件事。

对于Android,您正在寻找的视图不是ScrollView而是ViewPager

这可以使用GetChildAt方法在索引0下找到。

另外,为什么你使用VisualElementRenderer<CarouselPage>作为你的CustomCarouselPageRenderer的父类。而是像使用iOS一样使用CarouselPageRenderer

最后一件事是,在Android上,无法禁用ViewPager的Scroll。要获得此行为,您可以收听Touch事件。将TouchEventArgs的Handled属性设置为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即可滚动。

希望这可以帮助。-

© www.soinside.com 2019 - 2024. All rights reserved.