Xamarin.Forms 中的字体
默认情况下,Xamarin.Forms 使用每个平台定义的系统字体。 但是,显示文本的控件将定义可用于更改此字体的属性:
FontAttributes
,类型为FontAttributes
,是具有三个成员None
、Bold
和Italic
的枚举。 此属性的默认值为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 共享项目中并由平台项目使用,而无需任何额外工作。 完成此目的的过程如下所示:
- 将字体作为嵌入的资源添加到 Xamarin.Forms 共享项目(“生成操作:EmbeddedResource”)。
- 使用
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"
};
以下屏幕截图显示了自定义字体:
重要
对于 Windows 上的版本生成,请确保将包含自定义字体的程序集作为参数在 Forms.Init
方法调用中传递。 有关详细信息,请参阅疑难解答。
根据平台设置字体属性
OnPlatform
和 On
类可以在 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。 此外,还可以将此属性设置为命名的字号。FontFamily
–string
表示字体图标所属的字体系列。Color
– 显示字体图标时使用的可选Color
值。
字体数据可以通过任何可显示 ImageSource
的视图来显示。 此方法允许字体图标(如表情符号)由多个视图显示,而不是将字体图标显示限制为单个文本呈现视图(如 Label
)。
重要说明
字体图标目前只能通过其 Unicode 字符表示形式来指定。
下面的 XAML 示例具有由 Image
视图显示的单个字体图标:
<Image BackgroundColor="#D1D1D1">
<Image.Source>
<FontImageSource Glyph=""
FontFamily="{OnPlatform iOS=Ionicons, Android=ionicons.ttf#}"
Size="44" />
</Image.Source>
</Image>
此代码在 Image
视图中显示 Ionicons 字体系列中的 XBox 图标。 请注意,虽然此图标的 Unicode 字符是 \uf30c
,但它在 XAML 中必须进行转义,这样就变为 
。 等效 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
};
以下屏幕截图显示了一个可绑定布局显示的多个字体图标: