我正在尝试从资源文件中设置 UITabBarItem 的徽章颜色,但会选择除 默认红色以外的任何颜色。
我为 iOS 平台创建了一个自定义
ShellTabBarAppearanceTracker
,并尝试通过事件处理程序更新徽章颜色。
class BadgeShellTabbarAppearanceTracker : ShellTabBarAppearanceTracker
{
private UITabBarItem? notificationTabbarItem;
public override void UpdateLayout(UITabBarController controller)
{
// Set event listener to UpdateBadge here when count changes
}
private void UpdateBadge(int count)
{
if (notificationTabbarItem is not null)
{
Color cyan;
if (App.Current.Resources.TryGetValue("CyanAccent", out var colorvalue))
{
cyan = (Color)colorvalue;
notificationTabbarItem.BadgeColor = cyan.ToPlatform();
}
}
}
}
每次计数变化都会达到所有
UpdateBadge
代码。在单步执行和检查变量时,它甚至似乎正确设置了颜色。
替换对资源目录的查找,并将颜色设置为标准 MAUI 颜色也不会改变它。
notificationTabbarItem.BadgeColor = Colors.Blue.ToPlatform();
我尝试在主线程上调用它,没有任何改变:
MainThread.BeginInvokeOnMainThread(() =>
{
item.BadgeColor = Colors.Blue.ToPlatform();
});
也可以直接通过
TabBar.StandardAppearance
:
var appearance = controller.TabBar.StandardAppearance;
appearance.StackedLayoutAppearance.Normal.BadgeBackgroundColor = Colors.Pink.ToPlatform();
appearance.InlineLayoutAppearance.Normal.BadgeBackgroundColor = Colors.Pink.ToPlatform();
appearance.CompactInlineLayoutAppearance.Normal.BadgeBackgroundColor = Colors.Pink.ToPlatform();
与原始代码片段非常相似的代码非常适合 Android。
我应该在哪里/如何设置徽章的颜色?
提前致谢。
MAUI 中没有直接的 API 可以修改徽章颜色。如果需要,您可以在 GitHub 上提出功能请求。
是的,有一个解决方法,但有点棘手。那就是使用 Maui Handler。
我建议您参考如何在 iOS 上的 .NET MAUI 中增加 TabBar 菜单项的字体大小。我们针对此案例的解决方法也使用此流程。
唯一的不同是TabbedViewExtensions.cs。 (我上面发布的答案链接添加了一些代码来更改
UIStringAttributes
。不要忘记删除它们)。添加以下行来更改徽章颜色,
internal static void UpdateiOS15TabBarAppearance(
this UITabBar tabBar,
ref UITabBarAppearance _tabBarAppearance,
UIColor? defaultBarColor,
UIColor? defaultBarTextColor,
Color? selectedTabColor,
Color? unselectedTabColor,
Color? barBackgroundColor,
Color? selectedBarTextColor,
Color? unSelectedBarTextColor)
{
...
//Add the following line
if (App.Current.Resources.TryGetValue("CyanAccent", out var colorvalue))
{
var cyan = (Color)colorvalue;
_tabBarAppearance.StackedLayoutAppearance.Normal.BadgeBackgroundColor = cyan.ToPlatform();
}
...
希望有帮助!