【问题标题】:How to use custom font (any external font) as embedded resource in Xamarin Forms?如何在 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。?

标签: c# xamarin xamarin.forms


【解决方案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>
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 2017-11-16
    • 2018-09-05
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多