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

.NET MAUI iOS项目TabbedPage图标颜色无法修改的解决求助

.NET MAUI iOS应用导航栏图标颜色无法修改的问题

我正在使用.NET MAUI开发一款iOS专属移动应用,客户要求修改导航栏的图标及背景颜色。但目前遇到的问题是无法修改页面中的图标颜色:我已尝试在styles.xaml、ContentPage标签中设置,也使用了目标颜色的图片,但图标始终呈现灰色。

当前导航栏效果:
导航栏截图

以下是我已尝试修改的代码:

首页代码

<!-- icone_home本身已经是白色 -->
<ContentPage Title="Início" 
             BackgroundColor="#F1F1F1" 
             IconImageSource="icone_home.png" 
             Shell.TabBarTitleColor="Red" 
             Shell.TabBarBackgroundColor="Red" 
             Shell.TabBarDisabledColor="Red" 
             Shell.TabBarForegroundColor="Red" 
             Shell.TabBarUnselectedColor="Red">
    ...
</ContentPage>

Styles.xaml代码

<!-- 为了测试我把所有颜色都改了 -->
<Style TargetType="TabbedPage">
        <Setter Property="BarBackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource White}}" />
        <Setter Property="BarTextColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource White}}" />
        <Setter Property="UnselectedTabColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource White}}" />
        <Setter Property="SelectedTabColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource White}}" />
    </Style>

<!-- 对NAVIGATION PAGE和SHELL也做了同样的设置 -->

请问还需要修改哪些地方才能解决这个问题?


解决方案

1. 针对iOS Shell TabBar的全局样式设置

iOS的Shell TabBar默认会对图标做色调着色处理,哪怕你用的是白色图标,也会被系统默认色调覆盖成灰色。可以在AppShell.xaml里定义全局样式直接覆盖:

<Shell.Resources>
    <Style x:Key="CustomShellTabBarStyle" TargetType="TabBar">
        <!-- 导航栏背景色 -->
        <Setter Property="BarBackgroundColor" Value="Red" />
        <!-- 选中状态的图标/文字颜色 -->
        <Setter Property="SelectedColor" Value="White" />
        <!-- 未选中状态的图标/文字颜色 -->
        <Setter Property="UnselectedColor" Value="#CCCCCC" />
    </Style>
</Shell.Resources>

<!-- 在Shell标签上应用这个样式 -->
<Shell Style="{StaticResource CustomShellTabBarStyle}">
    <!-- 你的TabBar页面集合 -->
</Shell>

2. 禁用iOS图标自动着色(保留图标原始颜色)

如果想完全保留你自己图标的颜色,不让系统修改,可以在iOS项目里加个自定义渲染器:

在iOS项目中创建CustomShellRenderer.cs:

using Microsoft.Maui.Controls.Platform;
using UIKit;

namespace 你的应用命名空间.iOS;

public class CustomShellRenderer : ShellRenderer
{
    protected override IShellTabBarAppearanceTracker CreateTabBarAppearanceTracker()
    {
        return new CustomTabBarAppearanceTracker();
    }
}

public class CustomTabBarAppearanceTracker : ShellTabBarAppearanceTracker
{
    public override void SetAppearance(UITabBarController controller, ShellAppearance appearance)
    {
        base.SetAppearance(controller, appearance);
        
        // 遍历所有Tab项,强制使用图标原始颜色
        foreach (var tabItem in controller.TabBar.Items)
        {
            if (tabItem.Image != null)
            {
                tabItem.Image = tabItem.Image.ImageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal);
            }
        }
    }
}

然后在iOS项目的MauiProgram.cs里注册这个渲染器:

builder.ConfigureMauiHandlers(handlers =>
{
#if IOS
    handlers.AddHandler<Shell, CustomShellRenderer>();
#endif
});

3. 检查图片资源配置

确保你的图标是透明背景的PNG格式,并且在iOS项目的资源管理器中,把图片的Asset Catalog属性设置为Original(不要选Template,否则会被系统强制着色)。

4. 清理冲突属性

你之前在ContentPage上设置的一堆Shell.TabBar*属性可能和全局样式冲突,建议统一在AppShell里设置全局样式,移除ContentPage上的局部TabBar属性,避免优先级混乱。

内容的提问来源于stack exchange,提问作者Raphael Frei

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:02:05