Xamarin 隐藏特定内容页的状态栏

Xamarin 隐藏特定内容页的状态栏,xamarin,xamarin-forms,Xamarin,Xamarin Forms,我正在创建一个应用程序,希望在其中隐藏特定页面上的状态栏。在我的示例中,它是一个ContentPage。我发现了几个示例,其中info.plist用于隐藏它,但我只希望它用于特定页面,是否可能?使用NavigationPage.SetHasNavigationBar隐藏navigationbar很容易,但statusbar似乎有点不同。据我所知,Xamarin没有通过Xamarin.Forms类提供此功能。您需要在每个特定于平台的项目中实现它 protected override void On

我正在创建一个应用程序,希望在其中隐藏特定页面上的状态栏。在我的示例中,它是一个ContentPage。我发现了几个示例,其中info.plist用于隐藏它,但我只希望它用于特定页面,是否可能?使用NavigationPage.SetHasNavigationBar隐藏navigationbar很容易,但statusbar似乎有点不同。

据我所知,Xamarin没有通过Xamarin.Forms类提供此功能。您需要在每个特定于平台的项目中实现它

protected override void OnCreate (Bundle bundle)
{
    base.OnCreate (bundle);
    this.Window.ClearFlags(WindowManagerFlags.Fullscreen);
    SetContentView (Resource.Layout.Main);

    ...
}
然而,这应该是相当容易的,因为您可以使用来处理这个问题

下面是一个快速实现

App.cs

雄激素实施

IOS实现

其思想是,当需要将状态栏隐藏在特定的
ContentPage
上时,调用DependencyService实现来隐藏状态栏。您可能还需要在隐藏后再次显示它(不太确定)

注意:对于iOS,您需要更新Info.plist文件以允许应用程序更改状态栏可见性


您可以为此使用
页面渲染器。以下是一个例子:

public class NoStatusBarPageRenderer : PageRenderer
{
    public NoStatusBarPageRenderer()
    {
    }

    public override void ViewWillAppear(bool animated)
    {
        UIApplication.SharedApplication.SetStatusBarHidden(true, UIStatusBarAnimation.Fade);

        base.ViewWillAppear(animated);
    }

    public override void ViewDidDisappear(bool animated)
    {
        UIApplication.SharedApplication.SetStatusBarHidden(false, UIStatusBarAnimation.Fade);

        base.ViewDidDisappear(animated);
    }
}
然后,对于要隐藏状态栏的每个页面,添加一个属性以在该页面上使用此渲染器

[assembly: ExportRenderer(typeof(MyContentPage), typeof(NoStatusBarPageRenderer))]

这将隐藏Xamarin.Forms应用程序中所有视图的状态栏(根据问题的Xamarin.Forms标记),并且只在Android上工作。Android的实现将是public void hide(){var activity=Forms.Context as activity;activity.Window.clearfags(WindowManagerFlags.Fullscreen);}public void Show(){var activity=Forms.Context作为活动;activity.Window.AddFlags(WindowManagerFlags.Fullscreen);}@RasmusChristensen我会确保它能在你需要支持的所有Android版本上运行。我最初在Android 4.1.1上尝试过,但没有成功。这就是我使用上述代码的原因。你需要在名称空间级别上使用assembly属性,而不是类级别。只是一个小细节。它可以完美工作。我将名称空间全部删除用于该目的的r:)它在Android上不工作。状态栏的文本消失了,但框仍保留在那里。实际上,在页面呈现程序中执行此操作似乎比DependecyService更快。可能是因为它发生在出现和消失之前
[assembly: Xamarin.Forms.Dependency(typeof(StatusBarImplementation))]
namespace MyXamarinApp.Droid
{
    public class StatusBarImplementation : IStatusBar
    {
        public StatusBarImplementation()
        {
        }

        WindowManagerFlags _originalFlags;

        #region IStatusBar implementation

        public void HideStatusBar()
        {
            var activity = (Activity)Forms.Context;
            var attrs = activity.Window.Attributes;
            _originalFlags = attrs.Flags;
            attrs.Flags |= Android.Views.WindowManagerFlags.Fullscreen;
            activity.Window.Attributes = attrs;
        }

        public void ShowStatusBar()
        {
            var activity = (Activity)Forms.Context;
            var attrs = activity.Window.Attributes;
            attrs.Flags = _originalFlags;
            activity.Window.Attributes = attrs;
        }

        #endregion
    }
}
[assembly: Xamarin.Forms.Dependency(typeof(StatusBarImplementation))]
namespace MyXamarinApp.iOS
{
    public class StatusBarImplementation : IStatusBar
    {
        public StatusBarImplementation()
        {
        }

        #region IStatusBar implementation

        public void HideStatusBar()
        {
            UIApplication.SharedApplication.StatusBarHidden = true;
        }

        public void ShowStatusBar()
        {
            UIApplication.SharedApplication.StatusBarHidden = false;
        }

        #endregion
    }
}
public class NoStatusBarPageRenderer : PageRenderer
{
    public NoStatusBarPageRenderer()
    {
    }

    public override void ViewWillAppear(bool animated)
    {
        UIApplication.SharedApplication.SetStatusBarHidden(true, UIStatusBarAnimation.Fade);

        base.ViewWillAppear(animated);
    }

    public override void ViewDidDisappear(bool animated)
    {
        UIApplication.SharedApplication.SetStatusBarHidden(false, UIStatusBarAnimation.Fade);

        base.ViewDidDisappear(animated);
    }
}
[assembly: ExportRenderer(typeof(MyContentPage), typeof(NoStatusBarPageRenderer))]