我正在关注 Xamarin 提出的Fonts Tutorial,以便在每个平台上安装自定义下载字体。然而,我遇到了很多问题,我也试图找到一种方法来做一些事情,但是whitout找到了如何让它发挥作用。
首先,看看教程并从相关部分开始。的 Using a Custom Font
的iOS:
它说我们必须将 font.tff 添加到 Resources文件夹中。 然后,我们必须对Info.plist做些什么,但是什么?我不确定我该做什么。
机器人:
Android版Xamarin.Forms目前不提供将字体设置为自定义字体文件的功能,因此需要自定义渲染器。
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;
}
}
}
根据文档,将调用OnElementChanged()
,但事实并非如此。 Debug.WriteLine()不显示任何内容。的为什么吗
WinPhone 8.1:
我们必须将字体文件添加到应用程序项目中的/Assets/Fonts/
文件夹,并设置Build Action:Content。一旦实现,Windows Phone的Xamarin.Forms可以通过遵循特定的命名标准引用已添加到项目中的自定义字体。 但是,字体不会在视图上发生,字体保持标准,为什么?
此刻,经过大量的搜索,很多尝试......没什么..
我正在尝试添加DIN Condensed Bold
字体
我的XAML布局:
<ContentPage.Content>
<AbsoluteLayout BackgroundColor="#235A5E">
<!-- Menu -->
<AbsoluteLayout x:Name="Menu" BackgroundColor="#2F767B"
AbsoluteLayout.LayoutBounds="0,0,1,0.1"
AbsoluteLayout.LayoutFlags="All">
<Label x:Name="label" Text="Connection" TextColor="White" FontSize="30" VerticalOptions="Center" HorizontalOptions="Center"
AbsoluteLayout.LayoutBounds="0.5, 0, 0.8, 1"
AbsoluteLayout.LayoutFlags="All"/>
<Button x:Name="ConnectionButton" BackgroundColor="Transparent" BorderColor="Transparent"
AbsoluteLayout.LayoutBounds="1, 0.5, 0.2, 1"
AbsoluteLayout.LayoutFlags="All"/>
</AbsoluteLayout>
</AbsoluteLayout>
</ContentPage.Content>
因此Label的FontFamily属性可以设置为
<Label Text="Hello World !" FontFamily="DIN Condensed Bold"
但是,正如教程中所说,对于WinPhone的例子,它必须通过另一种方式完成,所以,我尝试用C#部分改变FontFamily。
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"
);
}
}
哪个也行不通!我也看到了一些关于XAML部分的有趣内容。我想(如果FontFamily有一天工作......)有一个defintion
我们可以编辑一个字段字符串来设置我页面的所有Label的FontFamily。
<ContentPage.Resources>
<ResourceDictionary>
</ResourceDictionary>
</ContentPage.Resources>
我看到我可以为MyPage.xaml的所有Label定义FontFamily,它是如何工作的?
我也是关于MVVM的新手,但是我试图将我的public string FontFamily { get; set; }
绑定到xaml <Label Text="Hello World !" FontFamily="{Binding FontFamily}"/>
中定义的标签,但又一次没有成功..
我完全陷入困境......谁可以帮助将教程作为教程,或者在教程之后向我解释我提到的每一件事。谢谢你的帮助!
答案 0 :(得分:18)
我认为在某些方面,Xamarin Forms方法比使用自定义渲染器(或效果等)更容易。首先,有官方指导:https://developer.xamarin.com/guides/xamarin-forms/user-interface/text/fonts/#Using_a_Custom_Font。
适用于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>
对于所有三个平台,此示例中的字体文件存储在Fonts子文件夹中。你看到上面的Android和UWP(WinPhone)路径反映了这一点。在iOS中,plist条目将路径信息保存为自定义字体。
最困难的部分是弄清楚字体名称/首选字体。请注意Android和UWP / WinPhone的“#”之后的差异。结合试错(Android)并感谢本文帮助指出所需的特异性:http://www.blendrocks.com/code-blend/2015/01/04/a-complete-guide-to-working-with-custom-fonts-in-your-windows-and-windows-phone-app。
该文章中最相关的部分是挑选和不明显的首选字体名称。 Windows字体查看器(以及Mac字体书,btw,afaik)不会显示首选系列名称。来自文章:
这部分“#Helvetica Neue LT Std”是一个含有的后缀 首选家庭。这是自定义字体工作所必需的。 后缀必须绝对正确且区分大小写。
- 找到它的最简单方法是使用名为dp4 font viewer的工具。它是免费的,可以找到downloaded here。找到你的字体 通过该程序,转到信息点击复制首选家庭。
- 请勿使用Windows内置的字体查看器,因为它不会显示正确的首选字体系列。
编辑:将OnPlatform代码段更新为当前推荐的语法。
EDIT2:将WinPhone平台更改为UWP并删除了UWP路径的反斜杠'\' - 没有意识到UWP / WinPhone没有工作!还修复了dp4字体查看器的下载链接,因为它现在需要“https”。
答案 1 :(得分:1)
如先前的作者所述,使用Xamarin.Forms不需要自定义渲染器。步骤是:
Here's detailed description,介绍如何在macOS,WPF和Android中添加和应用自定义字体。
答案 2 :(得分:0)
从Xamarin.Forms 4.5.530起,无需指定平台,也无需向每个本机项目(Android,iOS和UWP)添加字体文件。强烈推荐Xamarin devblogs文章作为指导。
我的方法:添加自定义字体文件fx。 OpenSans-Regular.ttf,到共享代码项目中的新文件夹。将[assembly: ExportFont("OpenSans-Regular.ttf", Alias = "OpenSans")]
和名称空间引用using Xamarin.Forms;
添加到共享代码项目中的AssemblyInfo.cs文件中。然后从.xaml文件中的控件引用别名名称,如下所示
<Label Text="Username" FontFamily="OpenSans" />
。