如何在 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 事件创建视图