You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 01:21:04