MasterDetailPage母版页不会打开,IsGestureEnabled设置为false Xamarin.Forms Android

时间:2016-11-03 15:05:18

标签: c# android xamarin xamarin.forms

我在我的应用上运行了一个主详情页面。打开母版页的标准方法是选择汉堡菜单图标或从左侧滑动。 我的一个详细页面碰巧使用了旋转木马页面。因此,从左侧滑动可以打开母版页或将旋转木马滑到左侧(如果发生错误事件,则会非常恼火)。

为了在从左侧滑动时停止显示母版页面,我将IsGestureEnabled设置为false。但是这会阻止母版页出现。尽管在按下汉堡菜单图标时它们会有触觉反馈,但它什么也没做。

有没有办法强制在MasterDetailPage上忽略滑动手势,而不是在图标上点击手势?

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

2 个答案:

答案 0 :(得分:1)

我通过为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))]

这并不能完全解决问题,但在刷卡时主页面不会打开。

答案 1 :(得分:0)

理查德的代码对我来说有一些变化

    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;
            }
        }
    }