【问题标题】:Xamarin.Forms SetHasNavigationBar false causes jump on PushAsyncXamarin.Forms SetHasNavigationBar false 导致 PushAsync 跳转
【发布时间】:2025-12-29 20:45:12
【问题描述】:

我正在使用添加导航栏

MainPage = new NavigationPage (new Home ());

然后在我的Home.cs 页面上我不想显示导航栏,只有从该页面链接的页面我想显示导航栏。为了阻止导航栏显示在此页面上,我在 Home.cs 的开头使用了以下代码。

NavigationPage.SetHasNavigationBar (this, false);

从这里使用Navigation.Push.Async 转到另一个页面时,我在Home.cs 的底部看到一个“跳转”(移动?)。就像它增加了下一页导航栏的高度。

在 iOS 上,如果您将 Home.cs 的背景颜色设置为除白色以外的任何颜色,则会导致明显的跳跃。

在 Android 上,它似乎只会在导航回 Home.cs 页面时导致这种“跳转”。

这是我用来推送到下一页的代码。

btn.Clicked += async (sender, e) => await Navigation.PushAsync (new TestPage ());

我试图从页面中删除所有 padding.margins 但这没有帮助。当我开始一个新项目来测试这一点时,我没有什么可以改变的,所以我想不出任何其他可以解决这个问题的改变。

如下图: Tried to show the jump in this gif

注意: 留意Home.cs(灰色)页面。

【问题讨论】:

  • 我也面临同样的问题.. 如何解决问题

标签: c# android ios xamarin xamarin.forms


【解决方案1】:

替代工作

我的情况是我来自没有导航栏的 SpringBoard。因此,当我转到带有导航栏的 ContentPage 时,我所做的是在 PushAsync 之前隐藏并在 PushAsync 之后显示导航栏。

NavigationPage.SetHasNavigationBar(page, false);

await Navigation.PushAsync(page);

NavigationPage.SetHasNavigationBar(page, true);

不确定这是否是一个巧妙的解决方案,但至少它摆脱了跳跃效应。作为副作用,它使导航栏从顶部滑入,看起来更像是一个经过深思熟虑的 UI 动画,然后是跳转内容。

【讨论】:

    【解决方案2】:

    环顾四周后,我发现这是 Xmarin.Forms 中的一个错误。没有关于何时会有修复或任何解决方法的消息。

    请留意此处的错误报告:

    https://bugzilla.xamarin.com/show_bug.cgi?id=32830


    解决方法(ish?)

    作为一种解决方法,我完全停止了动画的发生。添加false 作为第二个参数将禁用动画。这看起来不太好,但可能比看到小“跳跃”问题更好。

    btn.Clicked += async (sender, e) => await Navigation.PushAsync (new TestPage (), false);
    

    【讨论】:

    • 太糟糕了。花了这么长时间,但从未修复。
    【解决方案3】:

    作为临时解决方法,您可以使用 PushModalAsync,如果这适合您的应用程序。

    【讨论】:

    • 嗯,它确实解决了我遇到的问题,但对于我的应用程序,我觉得它不能很好地工作。更多的是寻找一种解决方法来保持动画原样但停止“跳跃”问题。感谢您的建议,可能会为某人处理。