使用自定义渲染器,可以在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
完成一样优雅?
更新:请参阅sample solution。
有几件事。
对于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即可滚动。
希望这可以帮助。-