Xamarin.forms: [Bug] ExportFont não funciona em UWP

Criado em 12 abr. 2020  ·  55Comentários  ·  Fonte: xamarin/Xamarin.Forms

Descrição

Fontes personalizadas não aparecem no UWP quando o novo ExportFontAttribute é usado.

Passos para reproduzir

  1. Adicione um arquivo TTF ou OTF do Google Fonts, FontAwesome, icomoon, etc. como um recurso incorporado em seu projeto compartilhado
  2. Adicione o atributo ExportFont à sua montagem. por exemplo [assembly: ExportFont("FA5Regular.otf", Alias = "FontAwesome")]
  3. Faça referência à família da fonte na marcação XAML
  4. Compile e execute o aplicativo UWP

Comportamento esperado

Uma fonte personalizada deve ser usada.

Comportamento Real

A fonte personalizada é usada em iOS e Android, mas não em UWP.

Informação básica

  • Versão com problema: 4.5.0.617
  • Estruturas de destino da plataforma:

    • iOS: 13,4

    • Android: 9.0

    • UWP: 18362

Link de reprodução

https://github.com/jfversluis/EmbeddedFontsSample

embedded fonts fonts 3 in-progress high impact UWP bug

Comentários muito úteis

Eu estou experimentando o mesmo problema. Parece que UWP é sempre uma reflexão tardia com o Xamarin.Forms e não é suportado tão bem. Eu entendo que seu uso é provavelmente muito menor do que Android ou iOS, mas é muito frustrante.

Todos 55 comentários

Fontes incorporadas com formato TTF ou OTF estão funcionando no Android e iOS.

Captura de pantalla 2020-04-20 a las 16 17 49

Na UWP, a fonte Fontawesome OTF não está funcionando conforme o esperado:
Captura de pantalla 2020-04-20 a las 16 17 59

Eu estou experimentando o mesmo problema. Parece que UWP é sempre uma reflexão tardia com o Xamarin.Forms e não é suportado tão bem. Eu entendo que seu uso é provavelmente muito menor do que Android ou iOS, mas é muito frustrante.

Também tive esse problema no UWP. No entanto, comecei a trabalhar quando eliminei o Alias ​​da declaração ExportFont.

Aqui está o que eu fiz:

  1. Eu criei minha própria fonte. Os glifos que usei foram todos mapeados para caracteres minúsculos
  2. No meu compartilhado projetado em App.xaml.cs, adicionei: [assembly: ExportFont ("karenfont.ttf")]
  3. Eu adicionei karenfont.ttf como um recurso incorporado ao diretório de nível superior do meu projeto compartilhado.
  4. No meu arquivo xaml de formulários xamarin, eu tinha o seguinte:
    <Button Text="b" FontFamily="karenfont"/>

Isso agora funciona em UWP. Não funciona no Android. Estou usando o Xamarin Forms v4.5.0.617

Eu estou experimentando o mesmo problema. Parece que UWP é sempre uma reflexão tardia com o Xamarin.Forms e não é suportado tão bem. Eu entendo que seu uso é provavelmente muito menor do que Android ou iOS, mas é muito frustrante.

Acho que muitos desenvolvedores do Xamarin (e desenvolvedores de estúdio visual que trabalham em coisas relacionadas ao Xamarin) usam apenas macs e, quando usam o Windows, simplesmente ignoram o UWP. às vezes, eles incluem UWP nos projetos de amostra, mas RARAMENTE eles são mostrados em apresentações de vídeo - então eu nem tenho certeza de que os recursos sendo demo realmente funcionam no UWP.

@jsuarezruiz Agora estou testando o ExportFont na primeira versão de lançamento do Xamarin 4.6, segui o exemplo mostrado em um vídeo do Xamarin e adivinhe, ele não funciona no UWP, apenas recebo quadrados. Funciona muito bem no Android. De acordo com o exemplo no aplicativo FlyMe, não estou usando um Alias. o arquivo de fonte está no nível superior do projeto compartilhado. não funciona.

Estou na infeliz posição de ter que oferecer suporte a iOS, Android e UWP para o nosso produto e o fato de que o UWP fica para trás com tanta frequência nos fez ter que esperar vários ciclos de lançamento para realmente usar os novos recursos.
Temos três fontes personalizadas que carregamos. Por alguma razão, a fonte do ícone é a única que não consigo carregar para UWP. As outras duas plataformas não apresentam problemas.

@joshminor, então você obtém 2 de 3 fontes trabalhando em UWP com este método?
Talvez haja algo específico em algumas fontes que esteja causando o problema ...

Na verdade, acabei de perceber que as duas fontes que funcionam estão instaladas como fontes do sistema na minha máquina de teste do Windows ... então isso pode ter algo a ver com isso.
Editar
Tentei instalar a fonte que não funciona, mas não mudou nada. Tentei uma fonte totalmente diferente do Google WebFonts ("Lobster") e funciona sem problemas (exceto que os aliases não funcionam)

Eu tentei a fonte lagosta e a única maneira de funcionar era se eu a tivesse instalada no sistema. a incorporação da fonte não funcionou.

Edit: Retiro, funcionou (eu tive um erro de digitação no nome). então, parece que algumas fontes funcionam e outras não? muito intrigante

um pouco mais de informação

Peguei essa fonte do google, renomeei o arquivo e suas referências no código de Lobster-Regular.ttf para Lobster-Regular-renamed.ttf - isso fez com que ele parasse de funcionar. Coloque o nome original de volta e funcionará novamente.
isso provavelmente indica que o nome do arquivo deve corresponder a alguma propriedade interna da própria fonte para que funcione e pode explicar por que as pessoas têm resultados diferentes com a mesma implementação - depende de algo dentro do próprio arquivo da fonte.

Acabei de atualizar para o Xamarin Forms 4.6.0.726 e minha fonte incorporada, karenfont, ainda está trabalhando em UWP (Windows 10 1903). Ainda não está funcionando no Android (Android 10).

A fonte que não carrega para mim é uma fonte de ícone customizada, eu verifiquei com FontForge que os nomes das famílias de fontes internas são exatamente iguais ao nome do arquivo, ainda não carregam. Tenho certeza de que existe um padrão aqui em algum lugar. Por enquanto, vou voltar à maneira como carregávamos as fontes antes (recursos por plataforma)

Eu criei minha fonte personalizada usando o aplicativo IcoMoon. O que pode ser interessante é que incorporar karenfont não funcionou até que mapeei os glifos para letras e, em seguida, referenciei a letra em meu xaml (em oposição a usar o código hexadecimal como: &#xf57e; )

Recriei meu arquivo de fonte e vi que ele pode funcionar, mas parece que o nome da fonte e o nome do arquivo precisam ser semelhantes para ter uma chance de funcionar.

Também descobri que, mesmo quando parece funcionar, nem todos os elementos da IU funcionam conforme o esperado, ou seja, os ícones da barra de ferramentas com a fonte da imagem da fonte não parecem estar funcionando, apenas obtenho um quadrado em vez do ícone adequado.

Estou tendo o mesmo problema ao usar a fonte MaterialDesignIcons (https://materialdesignicons.com/), funciona bem no iOS e Android, mas todos os retângulos no UWP.

Veja o mesmo aqui se o pacote de fontes está instalado parece funcionar, mas se for parte do projeto como FontAwesome ou MaterialDesignIcons que não estão instalados na máquina, não funcionará apenas pequenos retângulos.

Voltando à velha maneira de adicionar a cada projeto e referenciar no ResourceDictionary funciona, mas isso é mais trabalho e não a nova gostosura.

Não tenho certeza se isso é uma regressão ou nunca funcionou, pois meus outros projetos não incluíram UWP.

mesmo aqui, vendo apenas quadrados no UWP ...

Alguma atualização sobre quando isso será resolvido?

O mesmo aqui ... UWP sem esperança ...

O mesmo aqui. Parece que o UWP está morto.

Ok Tudo que eu preciso consertar para meu projeto atual, então vou dar uma olhada em como consertá-lo.

@samhouts @jsuarezruiz, por favor, mostre que está sendo trabalhado. obrigado

OK, acho que descobri o que está acontecendo aqui e não precisa de um PR.

Para UWP, a maneira antiga de fazer isso era adicionar o FontPack com um OnPlatform ao ResourcesDictionary e parecia mais ou menos assim:

<ResourceDictionary>
  <OnPlatform x:TypeArguments="x:String"
            x:Key="IconFont">
    <On Platform="Android"
        Value="materialdesignicons-webfont.ttf#Material Design Icons" />
    <On Platform="iOS"
        Value="Material Design Icons" />
    <On Platform="UWP"
        Value="/Assets/materialdesignicons-webfont.ttf#Material Design Icons" />
  </OnPlatform>
</ResourceDictionary>

Observe que para o Android e UWP há #Material Design Icons para que funcione com a fonte incorporada, esta parte ainda é necessária para UWP.

Achei isso como na base de código Xamarin para a Galeria de controle, o XAML tinha esta linha para a página EmbeddedFonts:

<Label Text="Mono Font" FontFamily="PTM55FT#PTMono-Regular"/>

Observe o #PTMono-Regular no final do nome da fonte!

Então eu adicionei #Material Design Icons ao final do meu nome da fonte assim:

FontFamily="materialdesignicons-webfont#MaterialDesignIcons"

E ei Presto, funciona, eu verifiquei e funciona em UWP / Droid e iOS, pois é tudo que preciso para meu projeto atual.

Se você quiser saber a parte que vem depois de #, é o nome da fonte dentro do arquivo de fonte e a maneira mais fácil de fazer isso é (no Win10, pelo menos!) Abrir o arquivo de fonte e bem no topo está o nome:

image

Espero que ajude você e acho que feche este problema @samhouts @jsuarezruiz, pois não há nada para consertar, exceto o Docs.

Acho que o XF deve obter o primeiro nome da fonte do arquivo, se não for especificado pelo usuário

Sim! Eu tenho isso em meu app.xaml e as fontes têm funcionado para mim:
<OnPlatform x:Key="MaterialWebFontFamily" x:TypeArguments="x:String"> <On Platform="Android" Value="materialdesignicons-webfont.ttf#Material Design Icons" /> <On Platform="UWP" Value="Assets/Fonts/materialdesignicons-webfont.ttf#Material Design Icons" /> </OnPlatform>

@ ktd12, mas você está usando as novas EmbeddedFonts?

@VladislavAntonyuk Talvez precise ser investigado então. Não tentei com uma versão mais antiga do XF, então não tenho certeza se já funcionou em UWP ou se é um novo problema, meu projeto atual destacou para mim. Fico feliz em dar uma olhada se é assim que você acredita que deveria funcionar.

Desculpe - falei muito cedo. A fonte que estou usando como uma fonte incorporada é uma que criei, chamada karenfont. Tenho o problema oposto de todo mundo: funciona em UWP, mas não em Android. Estou usando o XF 4.6.0.726, o Windows 10 1903 em um Surface Pro 7 e o Android 10 em um Samsung Galaxy s10
<Button x:Name="btnBackup" Text="b" HorizontalOptions="FillAndExpand" FontSize="Medium" FontFamily="karenfont"/>

No Windows, a letra "b" se parece com:
b on windows

No Android, a letra "b" se parece com:
b on android

Qual a aparência da fonte:
karenfont

OK, acho que descobri o que está acontecendo aqui e não precisa de um PR.

Para UWP, a maneira antiga de fazer isso era adicionar o FontPack com um OnPlatform ao ResourcesDictionary e parecia mais ou menos assim:

<ResourceDictionary>
  <OnPlatform x:TypeArguments="x:String"
            x:Key="IconFont">
    <On Platform="Android"
        Value="materialdesignicons-webfont.ttf#Material Design Icons" />
    <On Platform="iOS"
        Value="Material Design Icons" />
    <On Platform="UWP"
        Value="/Assets/materialdesignicons-webfont.ttf#Material Design Icons" />
  </OnPlatform>
</ResourceDictionary>

Observe que para o Android e UWP há #Material Design Icons para que funcione com a fonte incorporada, esta parte ainda é necessária para UWP.

Achei isso como na base de código Xamarin para a Galeria de controle, o XAML tinha esta linha para a página EmbeddedFonts:

<Label Text="Mono Font" FontFamily="PTM55FT#PTMono-Regular"/>

Observe o #PTMono-Regular no final do nome da fonte!

Então eu adicionei #Material Design Icons ao final do meu nome da fonte assim:

FontFamily="materialdesignicons-webfont#MaterialDesignIcons"

E ei Presto, funciona, eu verifiquei e funciona em UWP / Droid e iOS, pois é tudo que preciso para meu projeto atual.

Se você quiser saber a parte que vem depois de #, é o nome da fonte dentro do arquivo de fonte e a maneira mais fácil de fazer isso é (no Win10, pelo menos!) Abrir o arquivo de fonte e bem no topo está o nome:

image

Espero que ajude você e acho que feche este problema @samhouts @jsuarezruiz, pois não há nada para consertar, exceto o Docs.

Oi,
você consegue fazer isso funcionar no projeto de amostra? https://github.com/jfversluis/EmbeddedFontsSample
Tentei, mas sem sucesso.

Adicionar o #fontname não pareceu fazer nada para mim. A princípio pensei que funcionava, mas depois de desinstalei a fonte do sistema, ela voltou a exibir quadrados. Confirmei com outro colega de trabalho que se você instalar a fonte, ela começará a ser exibida corretamente.

Pesquisei um pouco mais e isso tem _algo_ a ver com o arquivo de fonte. Posso trocar para fontes diferentes e as coisas funcionarão bem. Vou tentar reexportar nossa fonte e ver se consigo fazer algo funcionar.

Sim, concordo, não funciona em UWP. Nem adicionando o #FontName conforme sugerido por @CliffAgius , a menos que você instale o arquivo Font manualmente no sistema operacional, Windows 10. Portanto, não, isso não é uma correção. :) e isso precisa ser tratado pela equipe @samhouts @jsuarezruiz, por favor.

O projeto de amostra apresentado no blog de lançamento do Xamarin em si não funciona para UWP, https://github.com/jfversluis/EmbeddedFontsSample
https://devblogs.microsoft.com/xamarin/embedded-fonts-xamarin-forms/

image

Parece que eles estão descartando intencionalmente o suporte para o Windows 10, sempre que lançam um novo recurso no Xamarin.Forms atualmente! :(

@UdaraAlwis sim, obrigado por postar, pois havia me esquecido totalmente disso, minha correção funcionou porque carreguei o FotPack na máquina de desenvolvimento para outra coisa, então pensei que estava funcionando. Assim que enviei para um cliente uma visualização, ele quebrou. Tive que reverter para a velha e prolixa maneira de adicionar fontes para este projeto, pois ele visa UWP para alguns usuários.

Não concordo que a equipe esteja desconsiderando o UWP nas compilações, mas os testes de IU não foram escritos para pegar isso e muitos desenvolvedores usam Macs, portanto não podem testar o UWP. Deve haver uma maneira melhor de fazer isso, talvez no estilo #HotRestart para janelas ao construir em um Mac.

Apenas adicionando meu voto.
ExportFont só funciona em UWP se a fonte já estiver instalada na máquina Windows. Portanto, ele não funcionará na máquina cliente quando o aplicativo for instalado.

Por enquanto, tive que colocar as fontes em uma pasta e definir a ação como conteúdo e referi-la com a notação #

/fonts/xyx.ttf#xyz.ttf

Consegui fazer com que as fontes fossem exibidas corretamente quando no modo de depuração ou quando a opção "compilar com a cadeia de ferramentas nativa .net" está desligada.
Ativar novamente a compilação nativa .net quebrará imediatamente todas as fontes.

Eu sou novo no Xamarin, então esta solução pode ser enganosa. Usei a abordagem explicada por @CliffAgius. Novamente, posso estar usando a maneira antiga ou completamente errada.

Para mim, não preciso instalar nenhuma fonte . A única maneira de funcionar para mim em todas as plataformas 3 é usando arquivos ".otf" em vez de arquivos ".ttf" .

Arquivos ".ttf" funcionam apenas para famílias de fontes de texto, mas não funcionam para Glyph.
Junto com isso, tenho que adicionar ".otf" a uma pasta específica de plataforma respectiva.

A seguir está meu uso e arquivo de recurso.

Código abaixo não testado para IOS.

Arquivo de recursos:

<?xml version="1.0" encoding="utf-8" ?>
<ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms"
                    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                    xmlns:d="http://xamarin.com/schemas/2014/forms/design"
                    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                    xmlns:local="clr-namespace:ProjectName.Themes.FontIcon;assembly=ProjectName.Themes"
                    mc:Ignorable="d"
                    x:Class="ProjectName.Themes.Styles.IconImage">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="ColorsResource.xaml" />
    </ResourceDictionary.MergedDictionaries>
    <OnAppTheme x:Key="ImageLogoSample"
                x:TypeArguments="FileImageSource"
                Light="{x:Static local:AwesomeFontSolid.TicketAlt}"
                Dark="{x:Static local:AwesomeFontSolid.PersonBooth}" />  
    <!-- Sizes -->
    <x:Double x:Key="SizeTabIcon">24</x:Double>

    <!-- Fonts Icon -->

    <OnPlatform x:TypeArguments="x:String"
                x:Key="FontAwesomeBrand">
        <On Platform="Android"
            Value="FABrand.otf#Font Awesome 5 Brands" />
        <On Platform="iOS"
            Value="FABrand-Regular" />
        <On Platform="UWP"
            Value="/Assets/FABrand.otf#Font Awesome 5 Brands" />
    </OnPlatform>

    <OnPlatform x:TypeArguments="x:String"
                x:Key="FontAwesomeRegular">
        <On Platform="Android"
            Value="FARegular.otf#Font Awesome 5 Pro" />
        <On Platform="iOS"
            Value="FontAwesome5Free-Regular" />
        <On Platform="UWP"
            Value="/Assets/FARegular.otf#Font Awesome 5 Pro" />
    </OnPlatform>

    <OnPlatform x:TypeArguments="x:String"
                x:Key="FontAwesomeSolid">
        <On Platform="Android"
            Value="FASolid.otf#Font Awesome 5 Pro" />
        <On Platform="iOS"
            Value="FontAwesome5Free-Solid" />
        <On Platform="UWP"
            Value="/Assets/FASolid.otf#Font Awesome 5 Pro" />
    </OnPlatform>



    <OnPlatform x:TypeArguments="x:String"
                x:Key="FontAwesomeLight">
        <On Platform="Android"
            Value="FALight.otf#Font Awesome 5 Pro" />
        <On Platform="iOS"
            Value="Font Awesome 5 Pro" />
        <On Platform="UWP"
            Value="/Assets/FALight.otf#Font Awesome 5 Pro" />
    </OnPlatform>

    <OnPlatform x:TypeArguments="x:String"
                x:Key="FontAwesomeSolidDuoTone">
        <On Platform="Android"
            Value="FASolidDuotone.otf#Font Awesome 5 Duotone" />
        <On Platform="iOS"
            Value="Font Awesome 5 Duotone" />
        <On Platform="UWP"
            Value="/Assets/FASolidDuotone.otf#Font Awesome 5 Duotone" />
    </OnPlatform>


    <OnPlatform x:TypeArguments="x:String"
                x:Key="MaterialDesign">
        <On Platform="Android"
            Value="MD.otf#Material Design Icons" />
        <On Platform="iOS"
            Value="Material Design Icons" />
        <On Platform="UWP"
            Value="/Assets/MD.otf#Material Design Icons" />
    </OnPlatform>

    <!--ICONS 30 by 30-->  
    <!--Black-->
    <FontImageSource x:Key="IconPowerOff"
                     FontFamily="{DynamicResource FontAwesomeSolid}"
                     Glyph="{x:Static local:AwesomeFontSolid.PowerOff}"
                     Size="30"
                     Color="Black" />
    <!--ICONS 100 by 100-->
    <FontImageSource x:Key="IconHand"
                     FontFamily="{DynamicResource FontAwesomeSolid}"
                     Glyph="{x:Static local:AwesomeFontSolid.Hands}"
                     Size="100"
                     Color="Black" />   
</ResourceDictionary>

E no uso Xamal

  <Image Margin="20,0" WidthRequest="30">
                        <Image.Source>
                            <FontImageSource
                                FontFamily="{StaticResource FontAwesomeSolid}"
                                Glyph="{x:Static local:AwesomeFontSolid.Users}"
                                Color="{DynamicResource SurfaceTextColor}" />
                        </Image.Source>
                    </Image>

Samit, eu tenho uma fonte .ttf funcionando usando embedded / ExportFont no Android / iOS.

No entanto, a solução de problemas é um acerto ou erro - nenhuma mensagem ou métrica para ajudá-lo a entender por que não funciona. Isso é algo que eu não gosto com a base de código Xamarin, em muitos casos em que você passa um parâmetro incorreto, a função simplesmente não faz nada em vez de informar que o valor de um parâmetro está incorreto. Mensagens de erro / registro / exceções podem ser realmente úteis.

Samit, eu tenho uma fonte .ttf funcionando usando embedded / ExportFont no Android / iOS.

No entanto, a solução de problemas é um acerto ou erro - nenhuma mensagem ou métrica para ajudá-lo a entender por que não funciona. Isso é algo que eu não gosto com a base de código Xamarin, em muitos casos em que você passa um parâmetro incorreto, a função simplesmente não faz nada em vez de informar que o valor de um parâmetro está incorreto. Mensagens de erro / registro / exceções podem ser realmente úteis.

Olá Chris,

Sim, observei o mesmo comportamento e foi difícil entender ou depurar o que está errado, o arquivo ".ttf" funciona para Android e IOS, mas não para UWP (Glyph).
Tentei usar o arquivo .otf e funcionou para todas as três plataformas de imagem (Glyph).

Outra coisa estranha é que ".ttf" funciona em todas as três plataformas para fonte de texto (não tenho certeza de como explicar, mas o arquivo Roboto-Italic.ttf funcionará em todas as 3 plataformas), mas como eu disse antes, Glyph de arquivo .ttf não é trabalhando.

Espero que tenhamos uma solução para isso em breve.

@Samit.
Acredito que seu código esteja se referindo à maneira "legada" de oferecer suporte a fontes personalizadas no Xamarin. Nesse cenário, você instala o arquivo de fonte em cada pasta do projeto e adiciona algum código de manifesto e, em seguida, refere-se ao nome da fonte conforme apresentado em seu exemplo de arquivo de recurso, onde cada plataforma obtém uma variação ligeiramente diferente do nome do arquivo.
O problema que foi relatado aqui com o recurso "ExportFont" que foi recentemente introduzido com o Xamarin e permite incluir a fonte uma vez no projeto Compartilhado e, em seguida, torná-la conhecida para o aplicativo com uma diretiva ExportFont.
[assembly: ExportFont ("Samantha.ttf", Alias ​​= "MyAwesomeCustomFont")]

https://devblogs.microsoft.com/xamarin/embedded-fonts-xamarin-forms/

O bug relatou que isso funciona para projetos Android e iOS, mas não para UWP, onde precisamos voltar ao método anterior.

Enfrentando o mesmo problema aqui. Estávamos usando a incorporação de fontes, que funciona muito bem no Android e iOS. E adicionamos um projeto UWP adicional devido a alguns requisitos do cliente. Não funciona de todo e tudo o que vemos são algumas caixas.

Samit, eu tenho uma fonte .ttf funcionando usando embedded / ExportFont no Android / iOS.
No entanto, a solução de problemas é um acerto ou erro - nenhuma mensagem ou métrica para ajudá-lo a entender por que não funciona. Isso é algo que eu não gosto com a base de código Xamarin, em muitos casos em que você passa um parâmetro incorreto, a função simplesmente não faz nada em vez de informar que o valor de um parâmetro está incorreto. Mensagens de erro / registro / exceções podem ser realmente úteis.

Olá Chris,

Sim, observei o mesmo comportamento e foi difícil entender ou depurar o que está errado, o arquivo ".ttf" funciona para Android e IOS, mas não para UWP (Glyph).
Tentei usar o arquivo .otf e funcionou para todas as três plataformas de imagem (Glyph).

Outra coisa estranha é que ".ttf" funciona em todas as três plataformas para fonte de texto (não tenho certeza de como explicar, mas o arquivo Roboto-Italic.ttf funcionará em todas as 3 plataformas), mas como eu disse antes, Glyph de arquivo .ttf não é trabalhando.

Espero que tenhamos uma solução para isso em breve.

Você pode querer verificar se o motivo do "Roboto-Italic.ttf" funcionar em todas as 3 plataformas é porque ele está fisicamente instalado na máquina Windows que você está usando para testar.
Levei muito tempo para descobrir por que algumas fontes funcionavam, com ExportFont, em UWP e outras não até que percebi que estava usando apenas fontes que já estavam instaladas no Windows.

O problema é que a UWP deseja o nome da fonte como parte do nome da família da fonte. O Xamarin Forms assume erroneamente que o nome da fonte é igual ao nome do arquivo da fonte. Para muitas fontes que não funcionam (FontAwesome por exemplo)

Vou criar um PR para corrigir esse problema.

Xamarin.Forms: 4.8.0.1269
ExportFont funciona para Android, mas não UWP

Em vez de usar ExportFont no projeto compartilhado, aqui está uma solução alternativa:

  1. Copie seu arquivo de fonte (xxx.ttf) para a pasta Assets no projeto Androind e UWP:

[Android]:
Assets / xxx.ttf
Ação de compilação: AndroidAsset
Copiar para o diretório de saída: não copie

[UWP]:
Assets / xxx.ttf
Criar ação: conteúdo
Copiar para o diretório de saída: não copie

  1. Define a propriedade FontFamily para seu texto:

       <Label.FontFamily>
            <OnPlatform x:TypeArguments="x:String">
                <On Platform="Android"
                    Value="xxx.ttf#Font Name" />
                <On Platform="UWP"
                    Value="/Assets/xxx.ttf#Font Name" />
            </OnPlatform>
        </Label.FontFamily>
    

Agora funciona como esperado!

@ johncao158 Essa é a maneira [ExportFont] não funcionar em UWP. A solução alternativa que você sugeriu ainda não permite que você adicione as fontes como um recurso incorporado.

Meu projeto funciona assim:

[PROJETO COMPARTILHADO]
AssemblyInfo.cs
[assembly: ExportFont ("entypo.ttf", Alias ​​= "entypo-plus")]
Fonts / entypo.ttf "para iOS e Android"

Criar ação: conteúdo
Copiar para o diretório de saída: não copie

Meu projeto funciona assim:

[PROJETO COMPARTILHADO]
AssemblyInfo.cs
[assembly: ExportFont ("entypo.ttf", Alias ​​= "entypo-plus")]
Fonts / entypo.ttf "para iOS e Android"

Criar ação: conteúdo
Copiar para o diretório de saída: não copie

Você está certo. Este novo recurso funciona em iOS e Android.
O problema é que ele não funcionará no Windows a menos que a fonte já esteja instalada na máquina.

Por que isso foi fechado? Embora as fontes personalizadas funcionem na depuração UWP, elas não funcionam em uma versão de lançamento.

Quando eu os uso em um sideload de versão de lançamento, a página em que a fonte personalizada está fica completamente em branco. Quando eu comento a família de fontes no xaml, a página parece boa ... mas sem fontes personalizadas, é claro.

Também verifiquei a pasta windows / font e a fonte estava no laptop em que instalei o aplicativo.

Tenho o mesmo problema que @ BillyMartin1964 na versão UWP, mesmo com o XF 4.8.0.1534 + 384-sha.712849b9d-azdo.4114742 mais recente

Também temos o mesmo problema que @ BillyMartin1964 - era muito confuso, pois as fontes funcionam bem no Android / iOS e até UWP no modo Debug, mas não no modo Release.

@samhouts, existe uma

No mínimo, podemos ter um código que ignore a fonte personalizada se ela não estiver instalada no computador / XBox do usuário?

No mínimo, podemos ter um código que ignore a fonte personalizada se ela não estiver instalada no computador / XBox do usuário?

Acho que você pode adicionar dois elementos na página e torná-los visíveis, dependendo da plataforma em que estão sendo executados. Use OnPlatform para isso.

@ArtjomP , esse não é o problema. A página inteira fica em branco quando usamos a fonte incorporada em um sideload de versão de lançamento para outro PC. Alguém disse que é porque o outro PC não tinha a fonte instalada anteriormente. Não tenho certeza sobre isso, mas se for o caso, precisamos testar a fonte instalada e não usá-la se não estiver instalada.

Pessoalmente, acho que é outro problema, porque parece que a fonte estava na pasta de fontes na máquina do usuário.

@ BillyMartin1964 muito estranho, todas as minhas páginas funcionam bem no lançamento UWP. Os rótulos com fonte personalizada mostram apenas quadrados como na imagem acima de @jsuarezruiz

@ArtjomP , você está instalando em outra máquina?

@ BillyMartin1964 claro que estou desenvolvendo aplicativos em minha máquina, CI com teste de IU em outra e os usuários usam meus aplicativos da Loja em seus PCs e Xboxes

@ArtjomP , não posso falar sobre a loja porque tenho medo de usá-la em um aplicativo de produção. Eu posso te dizer, a única diferença entre a página em branco ser branca ou não é remover o atributo FontFamily. O quadrado parece ser um ícone dele.

@ BillyMartin1964 você pode tentar remover as pastas obj e bin e reconstruir seu projeto com o atributo FontFamily incluído. Ajuda às vezes a se livrar de erros misteriosos.

Por que isso foi fechado? Embora as fontes personalizadas funcionem na depuração UWP, elas não funcionam em uma versão de lançamento.

Quando eu os uso em um sideload de versão de lançamento, a página em que a fonte personalizada está fica completamente em branco. Quando eu comento a família de fontes no xaml, a página parece boa ... mas sem fontes personalizadas, é claro.

Também verifiquei a pasta windows / font e a fonte estava no laptop em que instalei o aplicativo.

Há um novo problema para isso: # 12404

Esta página foi útil?
0 / 5 - 0 avaliações