首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xamarin表单定制字体CrossPlatform

Xamarin表单定制字体CrossPlatform
EN

Stack Overflow用户
提问于 2016-06-13 20:14:19
回答 3查看 8.5K关注 0票数 4

我遵循字体教程Xamarin提出的在每个平台上定制下载字体的建议。然而,我有很多问题,我也试图找到一种方法来做一些事情,但美白发现如何使它工作。

首先,看一看本教程,然后从相关部分开始。使用自定义字体

iOS:

它说,我们必须将font.tff添加到参考资料文件夹中。,那么,我们必须对Info.plist做些什么,但是什么?我不知道我要做什么。

Andro d:

安卓的Xamarin.Forms目前不公开将字体设置为自定义字体文件的能力,因此需要定制呈现器。

CustomLabelRenderer.cs

代码语言:javascript
复制
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 :Content。一旦实现,Xamarin.Forms for Windows就可以通过遵循特定的命名标准来引用已添加到项目中的自定义字体。但是,字体不发生在视图上,字体保持标准,为什么?

现在,经过大量搜索,很多尝试.没什么..。

我正在尝试添加DIN Condensed Bold字体

我的XAML布局:

代码语言:javascript
复制
<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>

所以标签的FontFamily属性可以这样设置

<Label Text="Hello World !" FontFamily="DIN Condensed Bold"

但是,正如本教程中所述,对于WinPhone来说,它必须通过另一种方式来完成,因此,我尝试通过C#部分来更改FontFamily。

代码语言:javascript
复制
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,我们可以编辑一个字段字符串来设置我的页面的所有标签的FontFamily。

代码语言:javascript
复制
<ContentPage.Resources>
  <ResourceDictionary>

  </ResourceDictionary>
</ContentPage.Resources>

我看到我可能能够为所有的FontFamily标签定义一个MyPage.xaml,它是如何工作的?

我也是一个关于MVVM的新手,但我尝试将我的public string FontFamily { get; set; }绑定到xaml <Label Text="Hello World !" FontFamily="{Binding FontFamily}"/>中定义的标签,但是又一次绑定,但没有成功。

我被卡住了..。谁能帮我制作教程,或者解释我在教程之后提到的每一件事。谢谢你帮忙!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-12-16 17:35:09

我认为在某种程度上,Xamarin Forms方法比需要自定义渲染器(或者效果等等)更容易。首先是官方指南:字型

对我来说,iOS、Android和UWP的工作解决方案最终是这样的:

代码语言:javascript
复制
    <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>

对于所有三个平台,本例中的字体文件存储在一个字体子文件夹中。您可以在上面的Android (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,顺便说一下,afaik)没有显示首选的姓氏。从该条中:

这一部分"#Helvetica Neue LT Std“是一个包含首选家族的后缀。它是必需的,以使自定义字体工作。后缀必须是绝对正确的,而且它区分大小写。

  • 找到它的最简单的方法是使用一个叫做dp4字体查看器的工具。它是免费的,可以找到在这里下载。通过程序找到你的字体,转到信息点击复制首选家庭。
  • 不要使用内置字体查看器的Windows,因为它没有显示正确的首选字体系列。

编辑:将OnPlatform片段更新为当前推荐的语法。

EDIT2:将WinPhone平台改为UWP,并删除了UWP路径的前导反斜杠'\‘--没有意识到这在UWP/WinPhone上是行不通的!还修正了dp4字体查看器的下载链接,因为它现在需要'https‘。

票数 19
EN

Stack Overflow用户

发布于 2018-12-15 22:28:27

2020年更新,Xamarin.Forms 4.5支持自定义字体嵌入在一个地方(共享UI项目)并通过ExportFont属性导出:https://learn.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/text/fonts#use-a-custom-font -为iOS,iOS和UWP工作。对于macOS和WPF,您仍然必须在每个平台项目中嵌入字体,如下所述。

  1. 下载TTF文件,并将其打包为每个平台项目的资源。
  2. 参考Xamarin.Forms共享项目中的字体,同时考虑到每个平台的特性(解决资源和字体系列的命名约定)。
  3. 将字体应用于Xamarin.Forms控件。

下面是详细的描述介绍如何在macOS、WPF和Android中添加和应用自定义字体。

票数 1
EN

Stack Overflow用户

发布于 2020-06-03 19:09:24

在Xamarin.Forms 4.5.530及以上版本中,不需要指定平台,也不需要向每个本机项目(Android、iOS和UWP)添加字体文件。强烈推荐Xamarin devblog文章作为指南。

我的方法:添加一个自定义字体文件,fx。OpenSans-Regular.ttf,共享代码项目中的一个新文件夹。将[assembly: ExportFont("OpenSans-Regular.ttf", Alias = "OpenSans")]和命名空间引用using Xamarin.Forms;添加到共享代码项目中的AssemblyInfo.cs文件中。然后从.xaml文件中的控件引用别名名称,比如so <Label Text="Username" FontFamily="OpenSans" />

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37798379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档