首页 > 解决方案 > 如何在 Android 中禁用轮播页面滚动

问题描述

使用自定义渲染器可以禁用CarouselPageon的滑动手势,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

更新:请参阅示例解决方案

标签: xamarinxamarin.formsxamarin.androidcarouselrenderer

解决方案


有几件事。

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

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

另外,为什么要VisualElementRenderer<CarouselPage>用作CustomCarouselPageRenderer. 而是CarouselPageRenderer像使用 iOS 一样使用 。

最后一件事是在Android上不能禁用 ViewPager 的滚动。要获得此行为,您可以侦听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 即可允许滚动。

希望这可以帮助。-


推荐阅读