Xamarin单ContentPage如何设置iOS、Android状态栏背景及文字颜色
Xamarin 单Content Page独立设置状态栏样式实现方案
1. 共享项目定义跨平台附加属性
首先在共享项目中创建静态类StatusBarHelper,为ContentPage扩展可绑定的状态栏样式属性:
public static class StatusBarHelper { // 状态栏背景色附加属性 public static readonly BindableProperty StatusBarColorProperty = BindableProperty.CreateAttached("StatusBarColor", typeof(Color), typeof(StatusBarHelper), Colors.Transparent); public static Color GetStatusBarColor(BindableObject view) { return (Color)view.GetValue(StatusBarColorProperty); } public static void SetStatusBarColor(BindableObject view, Color value) { view.SetValue(StatusBarColorProperty, value); } // 状态栏文字是否为深色附加属性 public static readonly BindableProperty IsDarkStatusBarTextProperty = BindableProperty.CreateAttached("IsDarkStatusBarText", typeof(bool), typeof(StatusBarHelper), false); public static bool GetIsDarkStatusBarText(BindableObject view) { return (bool)view.GetValue(IsDarkStatusBarTextProperty); } public static void SetIsDarkStatusBarText(BindableObject view, bool value) { view.SetValue(IsDarkStatusBarTextProperty, value); } }
2. Android端适配逻辑
在Android项目的MainActivity.cs中添加页面切换监听和状态栏更新逻辑:
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); Xamarin.Essentials.Platform.Init(this, savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); LoadApplication(new App()); // 监听NavigationPage页面切换事件,使用Shell则替换为Shell.Current.Navigated事件 var navPage = App.Current.MainPage as NavigationPage; navPage.Popped += (s, e) => UpdateStatusBar(); navPage.Pushed += (s, e) => UpdateStatusBar(); // 首次进入应用主动刷新样式 UpdateStatusBar(); } void UpdateStatusBar() { if (Build.VERSION.SdkInt < BuildVersionCodes.Lollipop) return; var currentPage = (App.Current.MainPage as NavigationPage).CurrentPage; var statusColor = StatusBarHelper.GetStatusBarColor(currentPage); var isDarkText = StatusBarHelper.GetIsDarkStatusBarText(currentPage); // 修改状态栏背景色 Window.SetStatusBarColor(statusColor.ToAndroid()); // Android 6.0及以上支持修改文字颜色 if (Build.VERSION.SdkInt >= BuildVersionCodes.M) { Window.DecorView.SystemUiVisibility = isDarkText ? (StatusBarVisibility)SystemUiFlags.LightStatusBar : 0; } }
3. iOS端适配逻辑
首先在iOS项目的Info.plist中添加配置:将UIViewControllerBasedStatusBarAppearance设为false,允许全局修改状态栏样式。
之后在AppDelegate.cs中添加逻辑:
public override bool FinishedLaunching(UIApplication app, NSDictionary options) { global::Xamarin.Forms.Forms.Init(); LoadApplication(new App()); // 监听页面切换,使用Shell则替换为Shell.Current.Navigated事件 var navPage = App.Current.MainPage as NavigationPage; navPage.Popped += (s, e) => UpdateStatusBar(); navPage.Pushed += (s, e) => UpdateStatusBar(); // 首次进入主动刷新 UpdateStatusBar(); return base.FinishedLaunching(app, options); } void UpdateStatusBar() { var currentPage = (App.Current.MainPage as NavigationPage).CurrentPage; var statusColor = StatusBarHelper.GetStatusBarColor(currentPage).ToUIColor(); var isDarkText = StatusBarHelper.GetIsDarkStatusBarText(currentPage); // 修改状态栏背景色 if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0)) { foreach (var window in UIApplication.SharedApplication.Windows) { var statusBarManager = window.WindowScene.StatusBarManager; if (statusBarManager == null) continue; var statusBarView = new UIView(statusBarManager.StatusBarFrame) { BackgroundColor = statusColor }; window.AddSubview(statusBarView); } } else { var statusBar = UIApplication.SharedApplication.ValueForKey(new NSString("statusBar")) as UIView; if (statusBar != null && statusBar.RespondsToSelector(new ObjCRuntime.Selector("setBackgroundColor:"))) { statusBar.BackgroundColor = statusColor; } } // 修改状态栏文字样式 UIApplication.SharedApplication.SetStatusBarStyle( isDarkText ? UIStatusBarStyle.DarkContent : UIStatusBarStyle.LightContent, true); }
4. 页面中使用
在需要自定义状态栏的ContentPage XAML中直接赋值附加属性即可:
Page1 绿色状态栏+深色文字示例
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:helper="clr-namespace:替换为你的共享项目命名空间" helper:StatusBarHelper.StatusBarColor="Green" helper:StatusBarHelper.IsDarkStatusBarText="True" x:Class="你的项目命名空间.Page1"> <!-- 页面内容 --> </ContentPage>
Page2 红色状态栏+浅色文字示例
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:helper="clr-namespace:替换为你的共享项目命名空间" helper:StatusBarHelper.StatusBarColor="Red" helper:StatusBarHelper.IsDarkStatusBarText="False" x:Class="你的项目命名空间.Page2"> <!-- 页面内容 --> </ContentPage>
内容的提问来源于stack exchange,提问作者Chim Di Tru
相关产品推荐
相关产品推荐

