如何在 Xamarin Forms 中使用自定义字体(任何外部字体)作为嵌入资源?

Posted

技术标签:

【中文标题】如何在 Xamarin Forms 中使用自定义字体(任何外部字体)作为嵌入资源?【英文标题】:How to use custom font (any external font) as embedded resource in Xamarin Forms? 【发布时间】:2020-04-16 21:48:40 【问题描述】:

我想在我的 Xamarin Forms 项目中使用自定义外部字体 (Monotype Corsiva) 作为嵌入式资源。我正在使用 Xamarin.Forms 版本 4.5.0.617

我在我的项目中添加了“MonotypeCorsiva.ttf”字体文件,并在解决方案资源管理器中设置了构建操作:嵌入式资源

我在 App.xaml.cs

中添加了[assembly: ExportFont("MonotypeCorsiva.ttf", Alias = "MyFont")]

我在 XAML 页面的 Label 中使用它:

<Label Text="Hello" FontFamily="MonotypeCorsiva" FontSize="Medium" />

我做的一切是否正确,我是否遗漏了什么?

我收到错误:

在 UWP 构建中:MyApplication.UWP\App.xaml.cs

在 Android 构建中

我在 MyApplication.Droid\MainActivity.cs

中遇到了类似的错误

System.TypeLoadException: 'Could not resolve type with token 01000072 from typeref (expected class 'Xamarin.Forms.ExportFontAttribute' in assembly 'Xamarin.Forms.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null')'

【问题讨论】:

我没有使用 Xamarin Forms 4.5 中包含的最新装饰器属性作为预览功能。它可能还不是很稳定,也不是对所有平台都可用。先试试安卓/ios。我看到你也使用了别名,你不需要在 fontfamily 上使用它而不是 name 吗?我正在使用旧方法通过将字体添加到每个平台来包含字体,所以抱歉,我无法提供更多帮助。 @Nk54,我也试过 android,但我遇到了类似的错误System.TypeLoadException: 'Could not resolve type with token 01000072 from typeref (expected class 'Xamarin.Forms.ExportFontAttribute' in assembly 'Xamarin.Forms.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null')' 尝试在每个平台更新包?尝试不使用别名(顺便说一句,您没有回答:您是否尝试将其设置为 ?您是否使用 chanel 进行测试?我在某个人的某个地方变红了让它在Android上运行。我的想法是它不是正确的包(pre),或者你的别名,或者你的字体文件属性。我无法帮助更多的抱歉。当你让它工作时让我更新! JIC,在 XF 存储库中注册的自定义字体存在 UWP 错误:github.com/xamarin/Xamarin.Forms/issues/10307 为什么不把 ttf 放到你的 android 资产文件夹中,并设置构建类型为 AndroidAsset。? 【参考方案1】:

我得到了它的工作,刚刚在我的解决方案中的所有项目中将 NuGet 包 Xamarin.Forms 更新到版本 4.5.0.617。

以前我仅在共享项目中将 Xamarin.Forms NuGet 包更新到版本 4.5x。因此遇到了这个错误

System.TypeLoadException: 'Could not load type Xamarin.Forms.ExportFontAttribute'`

现在我已将我的解决方案中的所有项目(Android、iOS 和 UWP)中的 Xamarin.Forms NuGet 更新为 4.5x 版本。请注意,在 Xamarin Forms 中使用外部自定义字体作为嵌入式资源需要 Xamarin.Forms 版本 4.5x 或更高版本refer to this link for more information

现在正确的做法是:

假设我想在我的项目中使用 Monotype Corsiva 字体并将其用作嵌入式资源。

在解决方案(Android、iOS、UWP 等)中的所有项目中将 Xamarin.Forms 更新到版本 4.5.0.530 或更高版本。为此,在解决方案资源管理器中,右键单击解决方案名称 -> 管理解决方案的 NuGet 包 -> 更新 Xamarin.Forms 包到 4.5x 或更高版本 -> 选择所有项目并更新。

在您的共享项目中添加字体文件 (.ttf)。

将文件设置为嵌入式资源右键单击解决方案资源管理器中的字体文件->属性 -> 构建操作:设置为嵌入式资源)。

在项目中任何类的任何命名空间之前添加[assembly: ExportFont("FontFileName.ttf", Alias = "MyFont")]。无需添加字体文件的完整路径。如果在启动命名空间之前添加新类并添加上述代码会更好。就像:

[assembly: ExportFont("MonotypeCorsiva.ttf", Alias = "MyFont")]
namespace MyApplication.Extensions
    
    public class ExportFont
    
        // You can have an empty class
        ... 
    

现在可以在任何 XAML 页面中使用它,就像
<Label Text="Hello" FontFamily="MonotypeCorsiva" FontSize="Medium" HorizontalOptions="CenterAndExpand" />

您可以在 XAML 代码中使用别名或字体名称。 FontFamily = "MyFont" 也是正确的。

现在运行项目。

【讨论】:

【参考方案2】:

尝试如下

<Label TextColor="#934293" Text="Swanky" FontSize="80">
    <Label.FontFamily>
        <OnPlatform x:TypeArguments="x:String">
            <On Platform="iOS">Cabin Sketch</On>
            <On Platform="Android">CabinSketch-Reg.ttf#Cabin Sketch</On>
        </OnPlatform>
    </Label.FontFamily>
</Label>

【讨论】:

其实他是用最新的方式使用字体。查看 Xamarin Forms 4.5 预发行说明。使用最新的字体使用方式,您不需要所有样板文件并在每个平台中都包含字体。证明在这里:docs.microsoft.com/en-us/xamarin/xamarin-forms/release-notes/…

以上是关于如何在 Xamarin Forms 中使用自定义字体(任何外部字体)作为嵌入资源?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Xamarin Forms 应用程序创建 Nuget 包

如何使用 Xamarin.Forms.Maps(无 Xamarin.Forms.GoogleMaps)在地图中应用样式或更改颜色

如何使用 ScnViewGestures.Forms 在 Xamarin.Forms 中使用 TouchDown 和 TouchUp 事件创建视图

在 Xamarin.Forms 中录制语音后如何保存音频文件

如何在 Xamarin.Forms 中获取/检测屏幕大小?

使用 CSS 修复自定义字体行高