【问题标题】:How can I change the font for the header of a Navigation page with Xamarin Forms?如何使用 Xamarin Forms 更改导航页面标题的字体?
【发布时间】:2018-07-07 21:35:53
【问题描述】:

我可以这样改变字体颜色:

var homePage = new NavigationPage(new HomePage())
{ 
   Title = "Home",
   Icon = "ionicons_2_0_1_home_outline_25.png",
   BarTextColor = Color.Gray,
};

但是有没有办法改变标题的字体。我只想为 iOS 和 Android 平台更改它。希望有人知道可以帮助我做到这一点的自定义渲染器代码。

【问题讨论】:

  • 只有自定义渲染器才有可能:forums.xamarin.com/discussion/22825/…
  • 谢谢,我看到这个链接是 2014 年的。希望有人能花时间想出一个 2018 年的解决方案,让这里的许多人受益。
  • 我没有看到在NavigationPage in the code 中添加了字体或字体大小,因此自定义渲染器是实现此目的的唯一方法(目前)。

标签: xamarin xamarin.forms xamarin.ios xamarin.android


【解决方案1】:

你需要自定义渲染器,参考this sample

iOS

[assembly: ExportRenderer(typeof(CustomNavigationPage), typeof(CustomNavigationPageRenderer))]
namespace CustomFontsNavigationPage.iOS.Renderers
{
public class CustomNavigationPageRenderer : NavigationRenderer
{
    protected override void OnElementChanged(VisualElementChangedEventArgs e)
    {
        base.OnElementChanged(e);

        if (e.NewElement != null)
        {
            var att = new UITextAttributes();
            UIFont customFont = UIFont.FromName("Trashtalk", 20);
            UIFont systemFont = UIFont.SystemFontOfSize(20.0);
            UIFont systemBoldFont = UIFont.SystemFontOfSize(20.0 , FontAttributes.Bold);
            att.Font = font;
            UINavigationBar.Appearance.SetTitleTextAttributes(att);
        }
    }
}
}

安卓

[assembly: ExportRenderer(typeof(CustomNavigationPage), typeof(CustomNavigationPageRenderer))]
namespace CustomFontsNavigationPage.Droid.Renderers
{
public class CustomNavigationPageRenderer : NavigationPageRenderer
{
    private Android.Support.V7.Widget.Toolbar _toolbar;

    public override void OnViewAdded(Android.Views.View child)
    {
        base.OnViewAdded(child);

        if (child.GetType() == typeof(Android.Support.V7.Widget.Toolbar))
        {
            _toolbar = (Android.Support.V7.Widget.Toolbar)child;
            _toolbar.ChildViewAdded += Toolbar_ChildViewAdded;
        }
    }

    protected override void Dispose(bool disposing)
    {
        base.Dispose(disposing);

        if(disposing)
        {
            _toolbar.ChildViewAdded -= Toolbar_ChildViewAdded;
        }
    }

    private void Toolbar_ChildViewAdded(object sender, ChildViewAddedEventArgs e)
    {
        var view = e.Child.GetType();

        if (e.Child.GetType() == typeof(Android.Widget.TextView))
        {
            var textView = (Android.Widget.TextView)e.Child;
            var spaceFont = Typeface.CreateFromAsset(Forms.Context.ApplicationContext.Assets, "Trashtalk.ttf");
            var systemFont = Typeface.DEFAULT;
            var systemBoldFont = Typeface.DEFAULT_BOLD;
            textView.Typeface = spaceFont;
            _toolbar.ChildViewAdded -= Toolbar_ChildViewAdded;
        }
    }
}
}

【讨论】:

  • 谢谢,还有什么方法可以改变字体大小和粗细。例如,如果我想保持相同的字体,但只是改变字体大小和粗细而不是使用新字体呢?谢谢
  • 你能告诉我这个渲染器的通用文件应该是什么样子吗?谢谢
【解决方案2】:

iOS 上不需要自定义渲染器,你可以使用Appearance API:

UINavigationBar.Appearance.SetTitleTextAttributes(new UITextAttributes
{
     Font = UIFont.FromName("MyCoolFont", 20)
});

在 Android 中,您确实需要渲染器,但您应该检查 Android.Support.V7.Widget.AppCompatTextView 而不是 Android.Widget.TextView

在 Xamarin.Forms 3.4.0 上测试

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多