为何Xamarin Forms会自行更改PNG图标的显示颜色
问题产生原因
- Xamarin Forms 针对按钮、工具栏/菜单类内置控件的图标,默认启用了自动色调适配逻辑,会优先套用系统主题色、控件对应
TextColor属性、全局样式中定义的图标色调,直接覆盖PNG本身的原始颜色 - 平台原生逻辑也会触发该问题:安卓端默认对材质设计风格的按钮、菜单图标应用预设色调;iOS端默认对导航栏、工具栏的图标自动应用全局
tintColor属性值,修改原始图标颜色
解决方案
全局禁用图标自动着色
适合所有按钮、菜单都需要保留PNG原始颜色的场景:
- 安卓端:在
MainActivity.cs的OnCreate方法中添加如下代码:
// 禁用按钮图标全局自动着色 AppCompatDrawableManager.Delegate = null; // 禁用工具栏菜单图标全局自动着色 if (Toolbar != null) { Toolbar.OverflowIcon?.SetTintList(null); }
- iOS端:在
AppDelegate.cs的FinishedLaunching方法中添加如下代码:
// 禁用导航栏图标全局自动着色 UINavigationBar.Appearance.TintColor = null; // 禁用按钮图标全局自动着色 UIButton.Appearance.TintColor = null;
单个控件禁用自动着色
如果不需要全局修改,仅针对部分使用白色PNG图标的控件调整,可按控件类型分别处理:
按钮控件
XAML中通过平台特定属性直接禁用着色:
<Button ImageSource="your_white_icon.png"> <Button.Android> <AndroidSpecific.Button TintColor="{x:Null}" /> </Button.Android> <Button.iOS> <IOSSpecific.Button TintColor="{x:Null}" /> </Button.iOS> </Button>
菜单/工具栏图标
- 安卓端:在平台层菜单资源的对应
item节点添加属性android:iconTint="@null" - iOS端:为
ToolbarItem自定义渲染器,在OnElementChanged方法中添加如下代码:
if (Control?.Image != null) { Control.Image = Control.Image.ImageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal); }
内容的提问来源于stack exchange,提问作者SmtHm
相关产品推荐
相关产品推荐

