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