【问题标题】:MasterDetailPage Master page wont open with IsGestureEnabled set to false Xamarin.Forms AndroidMasterDetailPage 母版页无法打开,IsGestureEnabled 设置为 false Xamarin.Forms Android
【发布时间】:2018-02-08 18:41:20
【问题描述】:

我的应用上有一个主详细信息页面。打开母版页的标准方法是选择汉堡菜单图标或从左侧滑动。 我的一个详细信息页面恰好使用轮播页面。因此,从左侧滑动可以打开母版页或将轮播向左滑动(如果发生错误事件会很烦人)。

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

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

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

【问题讨论】:

  • 您必须覆盖默认渲染器中的行为:github.com/xamarin/Xamarin.Forms/blob/… (Normal) / github.com/xamarin/Xamarin.Forms/blob/… (AppCompat)
  • @JonDouglas 这就是我所害怕的。你不会碰巧知道有这样一个行为被覆盖的例子,我可以从中获得灵感吗?
  • 我不知道。也许其他人可能知道。
  • 前几天我也注意到了这一点。对我来说似乎是一种回归(我发誓这曾经在早期版本的表单中工作,如果不是我会发疯的)。我看到您已经在 Bugzilla 中记录了一个问题。现在我们玩等待游戏。
  • 对于那些想知道的人,here is the Bugzilla report Richard 创建了。

标签: c# android xamarin xamarin.forms


【解决方案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))]

这并不能完全解决问题,但刷卡时母版页无法打开。

【讨论】:

  • 我也有同样的问题,但你的解决方案似乎效果不佳..我在模拟器上试过了,如果我在左边框上滑动鼠标,主人会打开。无论如何,谢谢!
  • @MarkO'Brian 诚然,我只在一台设备上尝试过(这是我尚未接受我的答案的原因)。我从 Xamarin 收到的一封电子邮件表明他们现在无法修复此问题,因为它是 API 底层的产物。
  • 感谢您的回答!我已经解决了我在主页 OnAppearing() 中设置 MasterDetailPage.IsGestureEnabled = true 并在主页 OnDisappearing() 中设置 MasterDetailPage.IsGestureEnabled = false 的问题。这样,我只在我的主页中启用了滑动,并在所有其他页面中禁用。这是一种解决方法,但幸运的是它有效!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    相关资源
    最近更新 更多