Xamarin Forms UWP 中的 FontAwesome

FontAwesome in Xamarin forms UWP

我有一个自定义渲染器在 Android 中与 Fontawesome 一起工作。 我正在遵循本指南 using font awesome in UWP 使用自定义标签类型尝试让 Fontawesome 在 UWP 中工作。

public class FontAwesomeLabel: Xamarin.Forms.Label    {
    public FontAwesomeLabel()        {
        switch (Device.RuntimePlatform)
      {
           case Device.UWP:
                FontFamily = @"/Assets/FontAwesome.otf#FontAwesome";
                break;
        }
    }
}

字体

被加载为 ttf 和 otf。我已经尝试了两种类型。 他们 Assest 字体具有构建操作 "Content"

mainView.Children.Add( new FontAwesomeLabel()
      {Text = FaConstPool.FASearch ,FontSize = 40});

public static string FASearch = "\uf002";

仅适用于 Android 而不适用于 UWP

我看到一个奇怪的方框,而不是 Android 预期的 Fontawesome 图标。

知道我做错了什么吗?

在 UWP 上添加字体的正确路径是 /Assets/Fonts/FontAwesome.ttf#FontAwesome 看来您必须添加 Fonts 文件夹。

像这样:

此外,您可以使用 Iconize plugin 并检查此答案:

问题的解决办法原来是在UWP中,使用正确的字体家族名称。 Font Awesome 5 Free Solid 而不仅仅是 "FontAwesome"

 // FontFamily = @"/Assets/FontAwesome.otf#FontAwesome"; // incorrect font family name
    FontFamily = @"/Assets/Fonts/FontAwesome.otf#Font Awesome 5 Free Solid";

任何对细节感兴趣的人:
我下载了一个字体编辑器来检查内部字体名称和字体系列名称。我错误地复制了使用 similar/older 字体值的博客文章。实际内容见图片。

我有两种解决方案:
1) 共享代码/.netStandard Common 项目中的自定义控件。
2) 自定义渲染器

解决方案 1:自定义标签

public class FontAwesomeLabel: Xamarin.Forms.Label
{
    public FontAwesomeLabel()
    {
        switch (Device.RuntimePlatform)
        {
           case Device.UWP:
             // make sure the correct font family name is used. Check in a font editor
               this.FontFamily = @"/Assets/Fonts/FontAwesome.otf#Font Awesome 5 Free Solid";
                break;
        }
    }
}

解决方案 2:标准控件上的客户渲染器

[assembly: ExportRenderer(typeof(Label), typeof(FontAwesomeLabelRenderer))]
namespace Oxando.UWP.CustomRenderers
{
public class FontAwesomeLabelRenderer : LabelRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
    {
        base.OnElementChanged(e);
        if (Control != null)
        {
            // on UWP be sure use the Font Family name.
            // get a font editor and check the name, if it doesnt match UWP wont load it
            if (FontAwesomeUtil.CheckIsFA(e.NewElement.Text))
            {
                Control.FontFamily = new FontFamily("/Assets/Fonts/FontAwesome.otf#Font Awesome 5 Free Solid");
            }
        }
    }
}
internal static class FontAwesomeUtil
{
    public static bool CheckIsFA(string text)
    {
        if (text.Length == 0) return false;
        if (text.Length > 1 || text[0] < 0xf000) return false;
        return true;
    }
}

}

字体编辑器中显示的实际内部名称