Xamarin 如何在Android中禁用旋转木马页面滚动

Xamarin 如何在Android中禁用旋转木马页面滚动,xamarin,xamarin.forms,xamarin.android,carousel,renderer,Xamarin,Xamarin.forms,Xamarin.android,Carousel,Renderer,使用自定义渲染器,可以在iOS上禁用CarouselPage的滑动手势,如下所示: using UIKit; using Xamarin.Forms; using Xamarin.Forms.Platform.iOS; [assembly: ExportRenderer(typeof(CarouselPage), typeof(CustomCarouselPageRenderer))] namespace App.iOS { public class CustomCarouselPag

使用自定义渲染器,可以在
iOS
上禁用
CarouselPage
的滑动手势,如下所示:

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
        }
    }
}
如何知道哪个
ScrollView
如果有的话

用一个循环来检查这个,就像这样

for (int i = 0; i < ChildCount; ++i)
{
    Android.Views.View view = (Android.Views.View)GetChildAt(i);
    if (view is ScrollView)
    {
    }
}
for(int i=0;i
产生以下结果:“给定的表达式永远不是提供的(
ScrollView
)类型”

所以!如何像在
iOS
中那样优雅地禁用旋转页面
滑动/滚动

更新:请看。

几件事

对于Android来说,您要查找的视图不是
ScrollView
,而是
ViewPager

这可以通过GetChildAt方法在索引0下找到

另外,为什么要使用
VisualElementRender
作为
CustomCarouseLPageRender
的父类。与iOS一样,使用
carouselpagerender

最后一件事是,在Android上,不能禁用ViewPager的滚动。要获得此行为,您可以收听触摸事件。将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;
        }
    }
}
[程序集:导出渲染器(typeof(CarouselPage)、typeof(customcarouselpagerender))]
命名空间StixApp.Droid.Renderers
{
公共类CustomRouseLPagender:CarouseLPagender
{
私有bool\u canScroll=false;
公共CustomCarouseLPageRender(上下文):基础(上下文)
{
}
公共CustomCarouselPageRenderer()
{
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
如果(this.ChildCount>0&&this.GetChildAt(0)是ViewPager ViewPager)
{
viewPager.Touch-=viewPagertouch;
viewPager.Touch+=viewPagertouch;
}
}
私有void ViewPagerTouched(对象发送方,TouchEventArgs e)
{
e、 已处理=!\u可以滚动;
}
}
}
只需将\u canScroll的值更改为true即可进行滚动


希望这有帮助。-

ViewPager
类中重写
方法

public class NonSwipeableViewPager : ViewPager
{    
    public override bool OnTouchEvent(MotionEvent e)
    {
        return false;
    }

    public override bool OnInterceptTouchEvent(MotionEvent ev)
    {
        return false;
    }

    public override bool ExecuteKeyEvent(KeyEvent ev)
    {
        return false;
    }
}
对旋转木马渲染器的更改

类中
声明:

public class MyCarouselPageRenderer : VisualElementRenderer<CarouselPage>
{
    NonSwipeableViewPager _viewPager;
}
注意:
CarouselPageAdapter
carouselpageender
MeasureSpecFactory
ObjectJavaBox
PageContainer
都必须从Xamarin复制。表单github可以启用自定义的
carouselpageender
实现。所有这些都在github示例中,但希望这能为将来的访问者更清楚地解释清楚


注2:我想强调的是,我们试图实现的真正行为可能最好使用NavigationPage,因为它允许我们在任何时候轻松弹出和推送任何和所有页面,而无需解决刷卡问题。话虽如此,希望此解决方案能够帮助在
转盘页面上需要此行为的任何人。首先,非常感谢。Second-
e.Handled=false
不会完全阻止刷卡操作。它似乎允许非常小的移动。我会调查的。另外-删除
e.Handled=false
赋值似乎是相同的行为。重写并使用自定义值是否更可行?注意:这就是我的父类VisualElementRenderer的来源。我选择了它,它按预期工作。是否符合最佳实践指南?使用自定义
ViewPager
的唯一方法是复制Xamarin.Forms
carouselpagerender
并在其中使用我们自己的
CustomViewPager
。该示例完全可以运行,所有代码都用于在
Android
@jth-Wow上禁用对
CarouselPage
的刷卡。是的,可以覆盖任何类以获得预期的行为。注意:对于未来的访问者,上面的链接引用
即将到期/已到期。有关github链接,请参见op。谢谢。您的示例解决方案工作得很好charm@Janwilx72我的荣幸。很高兴听到这有帮助!
public class MyCarouselPageRenderer : VisualElementRenderer<CarouselPage>
{
    NonSwipeableViewPager _viewPager;
}
protected override void OnElementChanged(ElementChangedEventArgs<CarouselPage> e)
{
    _viewPager = new NonSwipeableViewPager(Context);
}