Xamarin表单自定义字体CrossPlatform

时间:2016-06-13 20:14:20

标签: fonts cross-platform xamarin.forms

我正在关注 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}"/>中定义的标签,但又一次没有成功..

我完全陷入困境......谁可以帮助将教程作为教程,或者在教程之后向我解释我提到的每一件事。谢谢你的帮助!

3 个答案:

答案 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不需要自定义渲染器。步骤是:

  1. 下载TTF文件并将其作为资源捆绑到每个平台项目中
  2. 请参考Xamarin.Forms共享项目中的字体,并考虑到每个平台的特殊性(寻址资源和字体家族的命名约定)。
  3. 将字体应用于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" />

相关问题