如何在 Xamarin 中更改导航 Header 中所有工具栏项目的字体

How to change the font of all Toolbar Items in Navigation Header in Xamarin

我在 xamarin 中创建了一个自定义导航页面,以便更改导航栏中工具栏项目的字体。

一切顺利,但是所有工具栏项目的字体都没有改变,只是最后一个出于某种原因。

如您所见,除了字体之外,我还尝试将颜色更改为红色,但这也只适用于最后一项。

XAML:

<ContentPage.ToolbarItems>
    <ToolbarItem x:Name="MenuItem1"
                 Order="Primary"
                 Text="x1"
                 Priority="0" />
    <ToolbarItem x:Name="MenuItem2"
                 Order="Primary"
                 Text="x2"
                 Priority="1" />
    <ToolbarItem x:Name="MenuItem3"
                 Order="Primary"
                 Text="x3"
                 Priority="2" />
    <ToolbarItem x:Name="MenuItem4"
                 Order="Primary"
                 Text="x4"
                 Priority="3" />
</ContentPage.ToolbarItems>

iOS:

public class FontAwesomeNavigationPageRenderer : NavigationRenderer
{
    protected override void OnElementChanged(VisualElementChangedEventArgs e)
    {
        base.OnElementChanged(e);

        if(e.NewElement != null)
        {
            var att = new UITextAttributes
            {
                Font = UIFont.FromName("FontAwesome5Pro-Light", 18),
                TextColor = UIColor.Red
            };

            UIBarButtonItem.Appearance.SetTitleTextAttributes(att, UIControlState.Normal);
        }
    }
}

我错过了什么?

NavigationRenderer is a UINavigationController in iOS,因此您可以执行以下操作:

var navController = this as UINavigationController;
var navigationItems = navController.NavigationBar.Items)
List<UIBarButtonItem> barButtonItems = new List<UIBarButtonItem>();

foreach(UINavigationItem item in navigationItems) {
    barButtonItems.AddRange(item.NavigationBar.leftBarButtonItems);
    barButtonItems.AddRange(item.NavigationBar.rightBarButtonItems);
}

foreach(UIBarButtonItem bbItem in barButtonItems) {
    //change appearance for each bbItem
}

这将列出此 UINavigationController 的每个 UINavigationItem,然后获取与它们关联的每个 UIBarButtonItem

感谢 @iSpain17 在上面的评论中提供的一些帮助,我终于成功地完成了这项工作。

下面是 iOS 部分的代码

public override void ViewDidAppear(bool animated) {
    base.ViewDidAppear(animated);

    SetNavigationButtonsPage();
}

private void SetNavigationButtonsPage()
{
    var att = new UITextAttributes
    {
        Font = UIFont.FromName("FontAwesome5Pro-Light", 16),
    };

    var navigationItems = (this as UINavigationController).NavigationBar.Items;
    List<UIBarButtonItem> barButtonItems = new List<UIBarButtonItem>();

    foreach (UINavigationItem item in navigationItems)
    {
        barButtonItems.AddRange(item.LeftBarButtonItems);
        barButtonItems.AddRange(item.RightBarButtonItems);
    }

    foreach (UIBarButtonItem bbItem in barButtonItems)
    {
        //change appearance for each bbItem
        bbItem.SetTitleTextAttributes(att, UIControlState.Normal);
    }
}

解决方案是将正在使用的方法从 OnElementChanged 更改为 ViewDidAppear!

谢谢你:)