Xamarin.Forms 中的字体

默认情况下,Xamarin.Forms 使用每个平台定义的系统字体。 但是,显示文本的控件将定义可用于更改此字体的属性:

  • FontAttributes,类型为 FontAttributes,是具有三个成员 NoneBoldItalic 的枚举。 此属性的默认值为 None
  • double 类型的 FontSize
  • string 类型的 FontFamily

这些属性由 BindableProperty 对象提供支持,表示它们可以是数据绑定的目标,并可以设置样式。

设置字体特性

显示文本的控件可以设置 FontAttributes 属性来指定字体特性:

<Label Text="Italics"
       FontAttributes="Italic" />
<Label Text="Bold and italics"
       FontAttributes="Bold, Italic" />

等效 C# 代码如下:

Label label1 = new Label
{
    Text = "Italics",
    FontAttributes = FontAttributes.Italic
};

Label label2 = new Label
{
    Text = "Bold and italics",
    FontAttributes = FontAttributes.Bold | FontAttributes.Italic
};    

设置字号

显示文本的控件可以设置 FontSize 属性以指定字号。 可以直接将 FontSize 属性设置为 double 值,或通过 NamedSize 枚举值来设置:

<Label Text="Font size 24"
       FontSize="24" />
<Label Text="Large font size"
       FontSize="Large" />

等效 C# 代码如下:

Label label1 = new Label
{
    Text = "Font size 24",
    FontSize = 24
};

Label label2 = new Label
{
    Text = "Large font size",
    FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label))
};

或者,Device.GetNamedSize 方法具有将第二个参数指定为 Element 的重写:

Label myLabel = new Label
{
    Text = "Large font size",
};
myLabel.FontSize = Device.GetNamedSize(NamedSize.Large, myLabel);

注意

指定为 double 时,FontSize 值将以设备无关的单位进行度量。 有关详细信息,请参阅度量单位

有关命名字号的详细信息,请参阅了解命名字号

设置字体系列

显示文本的控件可以将 FontFamily 属性设置为字体系列名称,例如“Times Roman”。 但是,仅当特定平台支持该字体系列时,这种设置才有效。

有以使用多种方法来尝试派生平台上可用的字体。 但是,存在 TTF(True Type 格式)字体文件并不一定意味着存在字体系列,并且包含的 TTF 通常不适合在应用程序中使用。 此外,平台上安装的字体可能会随平台版本的变化而变化。 因此,指定字体系列的最可靠方法是使用自定义字体。

可以将自定义字体添加到 Xamarin.Forms 共享项目中并由平台项目使用,而无需任何额外工作。 完成此目的的过程如下所示:

  1. 将字体作为嵌入的资源添加到 Xamarin.Forms 共享项目(“生成操作:EmbeddedResource”)
  2. 使用 ExportFont 属性在 AssemblyInfo.cs 等文件中向程序集注册字体文件。 还可以指定可选的别名。

以下示例显示了向程序集注册 Lobster-Regular 字体以及别名:

using Xamarin.Forms;

[assembly: ExportFont("Lobster-Regular.ttf", Alias = "Lobster")]

注意

字体可以驻留在共享项目中的任何文件夹中,而无需在向程序集注册字体时指定文件夹名称。

在 Windows 上,字体文件名和字体名称可能不同。 若要在 Windows 上查找字体名称,请右键单击 .ttf 文件并选择“预览”。 然后可以从预览窗口确定字体名称。

然后可以通过引用相应的名称(不包括文件扩展名)在每个平台上使用该字体:

<!-- Use font name -->
<Label Text="Hello Xamarin.Forms"
       FontFamily="Lobster-Regular" />

或者,可以通过引用相应的别名在每个平台上使用该字体:

<!-- Use font alias -->
<Label Text="Hello Xamarin.Forms"
       FontFamily="Lobster" />

等效 C# 代码如下:

// Use font name
Label label1 = new Label
{
    Text = "Hello Xamarin.Forms!",
    FontFamily = "Lobster-Regular"
};

// Use font alias
Label label2 = new Label
{
    Text = "Hello Xamarin.Forms!",
    FontFamily = "Lobster"
};

以下屏幕截图显示了自定义字体:

iOS 和 Android 上的自定义字体

重要

对于 Windows 上的版本生成,请确保将包含自定义字体的程序集作为参数在 Forms.Init 方法调用中传递。 有关详细信息,请参阅疑难解答

根据平台设置字体属性

OnPlatformOn 类可以在 XAML 中用于设置每个平台的字体属性。 以下示例在每个平台上设置不同的字体系列和字号:

<Label Text="Different font properties on different platforms"
       FontSize="{OnPlatform iOS=20, Android=Medium, UWP=24}">
    <Label.FontFamily>
        <OnPlatform x:TypeArguments="x:String">
            <On Platform="iOS" Value="MarkerFelt-Thin" />
            <On Platform="Android" Value="Lobster-Regular" />
            <On Platform="UWP" Value="ArimaMadurai-Black" />
        </OnPlatform>
    </Label.FontFamily>
</Label>

可以在代码中使用 Device.RuntimePlatform 属性来设置每个平台的字体属性

Label label = new Label
{
    Text = "Different font properties on different platforms"
};

label.FontSize = Device.RuntimePlatform == Device.iOS ? 20 :
    Device.RuntimePlatform == Device.Android ? Device.GetNamedSize(NamedSize.Medium, label) : 24;
label.FontFamily = Device.RuntimePlatform == Device.iOS ? "MarkerFelt-Thin" :
   Device.RuntimePlatform == Device.Android ? "Lobster-Regular" : "ArimaMadurai-Black";

有关提供特定于平台的值的详细信息,请参阅提供特定于平台的值。 有关 OnPlatform 标记扩展的信息,请参阅 OnPlatform 标记扩展

了解命名字号

Xamarin.Forms 定义 NamedSize 枚举中表示特定字号的字段。 下表显示了 NamedSize 成员及其在 iOS、Android 和通用 Windows 平台 (UWP) 上的默认字号:

成员 iOS Android UWP
Default 17 14 14
Micro 12 10 15.667
Small 14 14 18.667
Medium 17 17 22.667
Large 22 22 32
Body 17 16 14
Header 17 14 46
Title 28 24 24
Subtitle 22 16 20
Caption 12 12 12

字号值以设备无关的单位进行度量。 有关详细信息,请参阅度量单位

注意

在 iOS 和 Android 上,命名字号将根据操作系统无障碍选项自动缩放。 可以在 iOS 上通过特定于平台的方式禁用此行为。 有关详细信息,请参阅 iOS 上命名字号的无障碍缩放

显示字体图标

通过在 FontImageSource 对象中指定字体图标数据,Xamarin.Forms 应用程序可以显示字体图标。 此类派生自 ImageSource 类,具有以下属性:

  • Glyph – 字体图标的 Unicode 字符值,指定为 string
  • Size – 一个 double 值,以独立于设备的单位表示所呈现的字体图标的大小。 默认值为 30。 此外,还可以将此属性设置为命名的字号。
  • FontFamilystring 表示字体图标所属的字体系列。
  • Color – 显示字体图标时使用的可选 Color 值。

字体数据可以通过任何可显示 ImageSource 的视图来显示。 此方法允许字体图标(如表情符号)由多个视图显示,而不是将字体图标显示限制为单个文本呈现视图(如 Label)。

重要说明

字体图标目前只能通过其 Unicode 字符表示形式来指定。

下面的 XAML 示例具有由 Image 视图显示的单个字体图标:

<Image BackgroundColor="#D1D1D1">
    <Image.Source>
        <FontImageSource Glyph="&#xf30c;"
                         FontFamily="{OnPlatform iOS=Ionicons, Android=ionicons.ttf#}"
                         Size="44" />
    </Image.Source>
</Image>

此代码在 Image 视图中显示 Ionicons 字体系列中的 XBox 图标。 请注意,虽然此图标的 Unicode 字符是 \uf30c,但它在 XAML 中必须进行转义,这样就变为 &#xf30c;。 等效 C# 代码如下:

Image image = new Image { BackgroundColor = Color.FromHex("#D1D1D1") };
image.Source = new FontImageSource
{
    Glyph = "\uf30c",
    FontFamily = Device.RuntimePlatform == Device.iOS ? "Ionicons" : "ionicons.ttf#",
    Size = 44
};

以下屏幕截图显示了一个可绑定布局显示的多个字体图标:

将在 iOS 和 Android 上显示的字体图标的屏幕截图