Fonts Xamarin跨平台形成自定义字体

Fonts Xamarin跨平台形成自定义字体,fonts,cross-platform,xamarin.forms,Fonts,Cross Platform,Xamarin.forms,我遵循Xamarin的建议,在每个平台上有一个自定义下载字体。然而,我遇到了很多问题,我也试图找到一种方法来做一些事情,但没有找到如何使它工作 首先,看一下教程,从相关部分开始 iOS: 它说我们必须将font.tff添加到资源文件夹中。 那么,我们必须对Info.plist做些什么,但是呢?我不确定我必须做什么。 Androïd: Forms for Android目前没有将字体设置为自定义字体文件的功能,因此需要自定义渲染器 CustomLabelRenderer.cs public cl

我遵循Xamarin的建议,在每个平台上有一个自定义下载字体。然而,我遇到了很多问题,我也试图找到一种方法来做一些事情,但没有找到如何使它工作

首先,看一下教程,从相关部分开始


iOS:

它说我们必须将font.tff添加到资源文件夹中。 那么,我们必须对Info.plist做些什么,但是呢?我不确定我必须做什么。

Androïd:

Forms for Android目前没有将字体设置为自定义字体文件的功能,因此需要自定义渲染器

CustomLabelRenderer.cs

public class CustomLabelRenderer : LabelRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
    {
        base.OnElementChanged(e);

        System.Diagnostics.Debug.WriteLine(Forms.Context.ApplicationContext.Assets, e.NewElement.StyleId + ".ttf");

        if (!string.IsNullOrEmpty(e.NewElement?.StyleId))
        {
            var font = Typeface.CreateFromAsset(Forms.Context.ApplicationContext.Assets, e.NewElement.StyleId + ".ttf");
            Control.Typeface = font;
        }
    }
}
所以标签的FontFamily属性可以这样设置


我认为,在某种程度上,Xamarin表单实现这一点的方法甚至比需要自定义渲染器(或效果等)更容易。首先,有官方的指导:

对于我来说,iOS、Android和UWP的有效解决方案是:

    <Label Text="The sly fox jumps over the lazy brown dog.">
        <Label.FontFamily>
            <OnPlatform x:TypeArguments="x:String">
                <On Platform="iOS" Value="OpenSans-Semibold"/>
                <On Platform="Android" Value="Fonts/OpenSans-Semibold.ttf#OpenSans-Semibold"/>
                <On Platform="UWP" Value="Assets\Fonts\OpenSans-Semibold.ttf#Open Sans"/>
            </OnPlatform>
        </Label.FontFamily>
    </Label>

对于所有三种平台,本例中的字体文件都存储在字体子文件夹中。您可以在上面的Android和UWP(WinPhone)路径中看到这一点。在iOS中,plist条目保存自定义字体的路径信息

最难的部分是找出字体名称/首选字体。注意Android和UWP/WinPhone在“#”之后的区别。尝试和错误的结合(Android),感谢本文帮助指出所需的特殊性:

这篇文章最相关的部分是如何挑剔和不明显的首选字体名称可以。Windows字体查看器(还有Mac字体手册,顺便说一句,afaik)不会显示首选的姓氏。从文章中:

本部分“#Helvetica Neue LT Std”是包含以下内容的后缀: 首选家庭。这是自定义字体工作所必需的。 后缀必须绝对正确并且区分大小写

  • 找到它的最简单方法是使用名为dp4字体查看器的工具。它是免费的,可以找到。找到你的字体 通过该程序,转到信息点击复制首选族
  • 不要使用Windows内置字体查看器,因为它不会显示正确的首选字体系列
编辑:将OnPlatform代码段更新为当前推荐的语法


EDIT2:将WinPhone平台更改为UWP,并删除了UWP路径的前导反斜杠“\”-没有意识到这在UWP/WinPhone上不起作用!还修复了dp4字体查看器的下载链接,因为它现在需要“https”。

2020更新,Xamarin。Forms 4.5支持在一个位置嵌入自定义字体(共享UI项目)并通过ExportFont属性导出:-适用于iOS、Android和UWP。对于macOS和WPF,您仍然必须在每个平台项目中嵌入字体,如下所述

  • 下载TTF文件,并将其作为资源捆绑到每个平台项目中
  • 参考Xamarin.Forms共享项目中的字体,考虑到每个平台的特性(用于寻址资源和字体系列的命名约定)
  • 将字体应用于Xamarin.Forms控件

  • 关于如何在macOS、WPF和Android中添加和应用自定义字体。

    自Xamarin.Forms 4.5.530及以上版本起,无需指定平台,也无需向每个本机项目(Android、iOS和UWP)添加字体文件。强烈推荐文章作为指导

    我的方法是:添加自定义字体文件fx。OpenSans-Regular.ttf,将其添加到共享代码项目中的新文件夹中。使用Xamarin.Forms添加
    [assembly:ExportFont(“OpenSans Regular.ttf”,Alias=“OpenSans”)]
    和名称空间引用
    到共享代码项目中的AssemblyInfo.cs文件。然后从.xaml文件中的控件引用别名,如下所示
    

    阅读该指南中链接的博客文章,它对修改信息有更详细的描述。plisty你也可以尝试一次解决一个平台——因为你在一篇文章中有多个问题,很难简明扼要地回答。好吧,那么对于其他人(Android/WinPhone)来说,为什么它不起作用呢?我只是想让一个问题/答案对有相同问题的人有用。我有类似的问题,请仔细检查文件名和字体名是否相同,字体名是否区分大小写。谢谢;)现在它适用于Android,但没有WinPhone 8.1…我还为此写了一篇博客,可能会对某些人有所帮助(我还添加了你的链接)
    public partial class MyPage : ContentPage
    {
        public string FontFamily { get; set; }
    
        public MyPage()
        {
            InitializeComponent();
    
            label.FontFamily = Device.OnPlatform(
                iOS: "DIN Condensed Bold",
                Android: "DIN Condensed Bold",
                WinPhone: @"Assets\Fonts\DINCondensedBold.ttf#DIN Condensed Bold"
            );
        }
    }
    
    <ContentPage.Resources>
      <ResourceDictionary>
    
      </ResourceDictionary>
    </ContentPage.Resources>
    
        <Label Text="The sly fox jumps over the lazy brown dog.">
            <Label.FontFamily>
                <OnPlatform x:TypeArguments="x:String">
                    <On Platform="iOS" Value="OpenSans-Semibold"/>
                    <On Platform="Android" Value="Fonts/OpenSans-Semibold.ttf#OpenSans-Semibold"/>
                    <On Platform="UWP" Value="Assets\Fonts\OpenSans-Semibold.ttf#Open Sans"/>
                </OnPlatform>
            </Label.FontFamily>
        </Label>