MasterDetailPage主页面无法在IsGestureEnabled设置为false时打开,Xamarin.Forms Android

7
我有一个主从页面在我的应用程序上运行。打开主页面的标准方法是选择汉堡菜单图标或从左侧滑动。我的其中一个详细页面使用了轮播页面。因此,从左侧滑动可以打开主页面,也可以将轮播向左滑动(如果发生错误的事件,这可能会很烦人)。
为了防止从左侧滑动时出现主页,请将IsGestureEnabled设置为false。但是,这会完全停止主页面的出现。尽管在按下汉堡菜单图标时有触觉反馈,但它什么也不做。
是否有一种方法可以强制忽略MasterDetailPage上的滑动手势而不是图标上的点击手势?
这是一个非常简单的应用程序,它具有MasterDetailPage和IsGestureEnabled设置为false。主页面将不会打开。 https://www.dropbox.com/s/rkm5eph3vr38avm/MasterDetailPageTest.zip?dl=0

你需要覆盖默认渲染器中的行为:https://github.com/xamarin/Xamarin.Forms/blob/74cb5c4a97dcb123eb471f6b1dffa1267d0305aa/Xamarin.Forms.Platform.Android/Renderers/MasterDetailRenderer.cs#L287(普通)/ https://github.com/xamarin/Xamarin.Forms/blob/d178a458ee1cdae63e1ffaf6f5445000f7b9cd0e/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs#L313(AppCompat) - Jon Douglas
@JonDouglas这就是我担心的。你不会碰巧知道一个例子,它有这种被覆盖掉的行为,让我可以借鉴吗? - Richard Pike
据我所知,没有这样的事情。也许其他人会知道。 - Jon Douglas
我也是前几天才注意到这个问题。对我来说,这似乎是一个回归错误(如果不是的话,那我可能疯了)。我看到你已经在Bugzilla中记录了一个问题。现在我们只能等待了。 - Will Decker
对于那些想知道的人,这是Richard创建的Bugzilla报告链接:https://bugzilla.xamarin.com/show_bug.cgi?id=46365。 - j.f.
显示剩余2条评论
2个回答

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))]

这并不能完全解决问题,但是主页面不再在滑动时打开。

我也遇到了完全相同的问题,但你提供的解决方案似乎效果不佳。我在模拟器上尝试了一下,如果我用鼠标在左边界划过去,主控将会打开。无论如何,还是非常感谢你! - Mark O' Brian
@MarkO'Brian 承认我只在一台设备上尝试过(这也是我还没有接受我的答案的原因之一)。 我收到的一封来自 Xamarin 的电子邮件表明,他们现在无法修复此问题,因为它是 API 底层的产物。 - Richard Pike
谢谢您的回答!我已经解决了我的问题,通过在我的主页OnAppearing()中设置MasterDetailPage.IsGestureEnabled = true,并在我的主页OnDisappearing()中设置MasterDetailPage.IsGestureEnabled = false。这样,我只在我的主页启用了滑动功能,在所有其他页面中禁用了它。虽然这是一种折中的方法,但幸运的是它有效! - Mark O' Brian

0

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接