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.Formscarouselpagerender
并在其中使用我们自己的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);
}