2016-06-13 3 views
2

Я следую за Fonts Tutorial, предложенный Xamarin, чтобы иметь пользовательские загруженные шрифты на каждой пластине. Однако у меня много проблем, и я также пытаюсь найти способ сделать что-то, но не знаю, как заставить его работать.Xamarin Forms Custom Fonts CrossPlatform

Прежде всего, взгляните на учебник и начните с соответствующей части. Using a Custom Font


IOS:

Он говорит, что мы должны добавить font.tff в ресурсов папки. Тогда нам нужно что-то сделать с Info.plist, но что? Я не уверен, что понимаю, что я должен делать.

AnDrOID:

Xamarin.Forms для Android в настоящее время не обнажить возможность установить шрифт пользовательского файла шрифта, так что требуются пользовательские рендеры.

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. После реализации Xamarin.Forms для Windows Phone может ссылаться на пользовательский шрифт, который был добавлен в проект, следуя определенному стандарту именования. Тем не менее, шрифт не отображается на экране, шрифт остается стандартным, почему?


В настоящее время, после многих поисков, много попробовать ... Ничего ..

Я пытаюсь добавить 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> 

Таким образом, свойство FontFamily метки может быть установлено так

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

Но, как сказано в учебнике, для примера WinPhone это должно быть сделано другим способом, поэтому я пытаюсь изменить FontFamily на часть C#.

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. Я хочу (f FontFamily работает один день ..), чтобы иметь defintion, мы заставляем меня просто редактировать одну строку поля, чтобы установить FontFamily Label на моей странице.

<ContentPage.Resources> 
    <ResourceDictionary> 

    </ResourceDictionary> 
</ContentPage.Resources> 

Я видел, что я мог бы быть в состоянии определить FontFamily для всего Этикетка MyPage.xaml, как это работает?

Я тоже новичок о MVVM, но я пытался связать свою public string FontFamily { get; set; } к метке, определенной в XAML <Label Text="Hello World !" FontFamily="{Binding FontFamily}"/>, но еще один раз, но безуспешно ..

Я застрял ... суммарно Кто может помогите либо сделать работы в учебнике, либо объяснить мне все, о чем я упоминал после учебника. Спасибо за помощь!

+1

прочитайте запись в блоге, связанную с этим Руководством, в нем есть более подробное описание модификации info.plist – Jason

+0

Вы также можете попробовать заняться этой платформой за один раз - так как у вас есть несколько вопросов, упакованных в один пост, который трудно ответить кратко – Jason

+1

Спасибо за ваш ответ. Хорошо, так что для других (Android/WinPhone) почему это не работает? Я просто хочу сделать вопрос/ответ полезным для людей, которые получили те же проблемы. – Emixam23

ответ

14

Я думаю, что в какой-то момент подход Xamarin Forms к этому упростился, даже если ему нужен Custom Renderer (или эффект и т. Д.). Во-первых, есть официальное руководство: 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="WinPhone" 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 Font Book тоже, кстати, afaik) не показывает вам предпочтительное имя. Из статьи:

Эта часть "#Helvetica Neue LT Std" является суффиксом, содержащий предпочтительного. Это необходимо для того, чтобы пользовательский шрифт работал. Суффикс должен быть абсолютно правильным и чувствительным к регистру.

  • Самый простой способ найти его - использовать инструмент, называемый dp4 viewer. Это бесплатно и можно найти downloaded here. Найдите свой шрифт через программу, перейдите к информации коснитесь копии предпочтительной семьи.
  • НЕ используйте Windows, встроенный в средство просмотра шрифтов, так как он НЕ отображает правильное семейство шрифтов.

EDIT: Обновлен OnPlatform фрагмент кода для текущего рекомендуемого синтаксиса.

Смежные вопросы