当isgestreenabled设置为false时,Master页将无法打开.Android

本文关键字:Android Master 设置 isgestreenabled false | 更新日期: 2023-09-27 18:16:05

我在我的应用程序上有一个主详细页面。打开主页面的标准方法是选择汉堡菜单图标或从左侧滑动。我的一个详细页面碰巧使用了轮播页面。因此,从左边滑动既可以打开母版页,也可以向左滑动旋转轮(如果发生错误的事件,这会非常令人恼火)。

为了阻止从左边滑动时出现母版页,我将isgestreenabled设置为false。然而,这将阻止母版页的出现。尽管在按汉堡菜单图标时有触觉反馈,但它没有任何作用。

是否有一种方法可以强制在MasterDetailPage上忽略滑动手势,而不是图标上的点击手势?

这是一个非常简单的应用程序,它的MasterDetailPage和IsGestureEnabled设置为false。母版页无法打开。https://www.dropbox.com/s/rkm5eph3vr38avm/MasterDetailPageTest.zip?dl=0

当isgestreenabled设置为false时,Master页将无法打开.Android

我通过为MasterDetailPage创建一个自定义渲染器来解决这个问题。它应该适合我现在的需要。

public class MyMasterDetailPageRenderer : Xamarin.Forms.Platform.Android.AppCompat.MasterDetailPageRenderer
{
    public override bool OnTouchEvent(MotionEvent e)
    {
        if (IsDrawerOpen(Android.Support.V4.View.GravityCompat.Start))
            return base.OnTouchEvent(e);
        else
        {
            if (e.Action == MotionEventActions.Up || e.Action == MotionEventActions.Down)
                return base.OnTouchEvent(e);
            else
            {
                CloseDrawers();
                return true;
            }
        }
    }
}

装配线需要添加到名称空间之外:

[assembly: ExportRenderer(typeof(MyMasterDetailPage), typeof(MyMasterDetailPageRenderer))]

这并不能完全解决问题,但是当滑动时母版页不再打开

Richard的代码在做了一些修改后就可以为我工作了

    RootView page;
    protected override void OnElementChanged( VisualElement oldElement, VisualElement newElement ) {
        base.OnElementChanged( oldElement, newElement );
        page = newElement as RootView;
    }
    public override bool OnTouchEvent( MotionEvent e ) {
        if( IsDrawerOpen( Android.Support.V4.View.GravityCompat.Start ) )
            return base.OnTouchEvent( e );
        else {
            if( (e.Action == MotionEventActions.Up || e.Action == MotionEventActions.Down || e.Action == MotionEventActions.Move)
                && (page?.SwipeEnabled ?? false)
            )
                return base.OnTouchEvent( e );
            else {
                CloseDrawers();
                return true;
            }
        }
    }