Как установить пользовательский шрифт для приложения xamarinf forms

#fonts #xamarin.forms #xamarin.forms-styles

#шрифты #xamarin.forms #xamarin.forms-стили

Вопрос:

Я пытаюсь установить пользовательский шрифт для всего приложения xamarin forms, используя style в app.xaml. Но я получаю необработанное исключение для того же.

 <OnPlatform x:Key="AppFontFamily" x:TypeArguments="x:String"
      Android="customfont.otf#CustomFont-Regular">
</OnPlatform>

<Style x:Key="labelFont" TargetType="Label">
        <SetterProperty Property="FontFamily" Value="{StaticResource AppFontFamily}"></SetterProperty>
      </Style>
  

Используя стиль на моей странице содержимого следующим образом

 <Label Style="{StaticResource labelFont}"></Label>
  

Любое решение для этого?

Комментарии:

1. Вы читали документы? developer.xamarin.com/guides/xamarin-forms/user-interface/text /…

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

Ответ №1:

Если вы хотите установить шрифт для всех меток с помощью файла шрифтов, вам необходимо создать пользовательский рендерер. Там переопределите OnElementChanged следующим образом:

  protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
    {
        base.OnElementChanged(e);
        try
        {
            Typeface font = Typeface.CreateFromAsset(Forms.Context.Assets, path);
            Control.Typeface = font;
        }
        catch(Exception ex)
        {
            System.Diagnostics.Debug.WriteLine("Unable to make typeface:"   ex);
        }
    }
  

Однако, если вы хотите иметь возможность устанавливать пользовательский шрифт для каждой отдельной метки, вам нужно создать (в pcl) пользовательский класс label, наследуемый от Label, и добавить к нему свойство font (если быть точным — свойство, которое вы будете использовать для передачи пути к файлу шрифта).

 public static readonly BindableProperty CustomFontProperty =
        BindableProperty.Create(
            "CustomFont",
            typeof(string),
            typeof(CustomLabel),
            default(string));

    public string CustomFont
    {
        get { return (string)GetValue(CustomFontProperty); }
        set { SetValue(CustomFontProperty, value); }
    }
  

Затем в вашем средстве визуализации вы можете прочитать это свойство следующим образом:

 var label = Element as CustomLabel;
string path = label.CustomFont;
  

Имейте в виду, что path в Android использует ‘/’ в качестве разделителей, а не ‘.’ как в формах.