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

如何在.NET MAUI中设置全局背景图(含手机状态栏)

在.NET MAUI中实现覆盖状态栏的全局背景图

要实现覆盖手机状态栏(含时间、电量栏)的全局背景图,需要分平台配置状态栏透明,再设置全局背景布局,具体步骤如下:

1. 配置状态栏为透明(分平台操作)

Android 端

在Platforms/Android/Resources/values/styles.xml中修改MainTheme样式,将状态栏设为透明,并允许内容延伸到状态栏区域:

<style name="MainTheme" parent="MainTheme.Base">
    <!-- 设置状态栏透明 -->
    <item name="android:statusBarColor">@android:color/transparent</item>
    <!-- 允许内容延伸到刘海/状态栏区域 -->
    <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
    <item name="android:windowTranslucentStatus">true</item>
</style>

iOS 端

在Platforms/iOS/Info.plist中添加配置,让视图延伸到状态栏,并设置状态栏文字为浅色(避免被背景图遮挡):

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
<key>UIViewControllerEdgeExtendedLayout</key>
<true/>

同时在Platforms/iOS/AppDelegate.cs的FinishedLaunching方法中添加:

UIApplication.SharedApplication.SetStatusBarStyle(UIStatusBarStyle.LightContent, false);

2. 设置全局背景图

可以通过两种方式实现全局生效:

方式一:自定义基类页面(推荐)

创建一个BasePage类,所有业务页面继承该类,统一设置背景图:

public class BasePage : ContentPage
{
    public BasePage()
    {
        // 创建背景图控件,填充整个页面
        var backgroundImage = new Image
        {
            Source = "background_image.png", // 替换为你的背景图文件名
            Aspect = Aspect.Fill,
            AbsoluteLayout.LayoutFlags = AbsoluteLayoutFlags.All,
            AbsoluteLayout.LayoutBounds = new Rect(0, 0, 1, 1)
        };

        // 构建绝对布局,将背景图放在最底层
        var rootLayout = new AbsoluteLayout();
        rootLayout.Children.Add(backgroundImage);

        // 将页面内容叠加在背景图上方
        var contentContainer = new ContentView
        {
            Content = this.Content,
            AbsoluteLayout.LayoutFlags = AbsoluteLayoutFlags.All,
            AbsoluteLayout.LayoutBounds = new Rect(0, 0, 1, 1)
        };
        rootLayout.Children.Add(contentContainer);

        Content = rootLayout;

        // 若需要内容不被状态栏遮挡,可设置顶部内边距;若要内容覆盖状态栏,设为0
        // Padding = new Thickness(0, GetStatusBarHeight(), 0, 0);
        Padding = new Thickness(0);
    }

    // 获取状态栏高度(仅Android需要)
    private double GetStatusBarHeight()
    {
        if (DeviceInfo.Current.Platform != DevicePlatform.Android) return 0;
        using var window = Android.App.Application.Current.Window;
        var insets = window.InsetsController?.GetInsets(Android.Views.WindowInsets.Type.StatusBars);
        return insets?.Top ?? 0;
    }
}

之后你的业务页面只需继承BasePage即可自动应用全局背景:

public class HomePage : BasePage
{
    // 页面逻辑...
}

方式二:利用Shell全局样式

如果项目使用Shell,可在AppShell.xaml中设置全局页面样式:

<Shell.Resources>
    <ResourceDictionary>
        <Style TargetType="ContentPage">
            <Setter Property="BackgroundImageSource" Value="background_image.png"/>
            <Setter Property="Padding" Value="0"/> <!-- 让内容覆盖状态栏 -->
        </Style>
    </ResourceDictionary>
</Shell.Resources>

3. 适配与测试

  • 确保背景图资源已正确添加到各平台的资源目录(Android在Resources/drawable,iOS在Resources)
  • 测试不同机型(尤其是刘海屏设备),确认背景图完整覆盖状态栏,同时保证页面交互元素可正常操作

内容的提问来源于stack exchange,提问作者Vladyslav Malin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 14:22:21