Xamarin 表单:UWP 和 Windows 8.1 中的自定义字体
Xamarin forms: Custom Fonts in UWP and Windows 8.1
我正在开发一个使用 font.otf 文件的应用程序。我的应用程序将在 android、ios、windows 10 和 windows 8.1 上 运行。我需要为我的标签创建样式来设置字体系列。
对于 android 和 ios 我引用了这个 link
我在 xaml 页面中试过这样-
<Label.FontFamily>
<OnPlatform x:TypeArguments="x:String">
<OnPlatform.iOS></OnPlatform.iOS>
<OnPlatform.Android>Lobster-Regular.ttf#Lobster-Regular</OnPlatform.Android>
<OnPlatform.WinPhone></OnPlatform.WinPhone>
</OnPlatform>
</Label.FontFamily>
new Label {
Text = "Hello, Forms!",
FontFamily = Device.OnPlatform (
null,
null,
@"\Assets\Fonts\Lobster-Regular.ttf#Lobster-Regular"
// Windows Phone will use this custom font
)
}
但是当我 运行 我的应用程序字体没有设置为 Windows 10 和 8.1。
如何为 windows 10 和 8.1 设置字体系列。
或者有没有更有效的方法来应用覆盖所有平台的字体系列?
您可以尝试创建一个 CustomRenderer
来覆盖 Windows 平台上的 Xamarin.Forms.Label
,如下所示:
[assembly: ExportRenderer(typeof(Xamarin.Forms.Label), typeof(MyLabelRenderer))]
namespace MyApp.CustomRenderers.Controls
{
public class MyLabelRenderer : LabelRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
{
base.OnElementChanged(e);
if (Control != null)
{
var font = new FontFamily(@"\Assets\Fonts\Lobster-Regular.ttf#Lobster-Regular");
if (e.NewElement != null)
{
switch (e.NewElement.FontAttributes)
{
case FontAttributes.None:
break;
case FontAttributes.Bold:
//set bold font etc
break;
case FontAttributes.Italic:
//set italic font etc
break;
default:
break;
}
}
Control.FontFamily = font;
}
}
}
注意:如果您使用的是 NavigationPage
,则 custom fonts do not work 存在错误
在 Windows 8.1/UWP 上,您不需要自定义字体的自定义渲染器; Xamarin 示例代码只是有几个错误:
- 改用正斜杠 ('/')
- 路径应该是
[font file]#[font name]
的形式(没有字体样式,例如'regular')
所以本例中的路径实际上应该是
"Assets/Fonts/Lobster-Regular.ttf#Lobster"
您也可以在 Xaml
中使用它
<OnPlatform.WinPhone>Assets/Fonts/Lobster-Regular.ttf#Lobster</OnPlatform.WinPhone>
确保你的字体文件包含在你的项目中 BuildAction:Content
并且它应该可以工作。
我正在开发一个使用 font.otf 文件的应用程序。我的应用程序将在 android、ios、windows 10 和 windows 8.1 上 运行。我需要为我的标签创建样式来设置字体系列。 对于 android 和 ios 我引用了这个 link
我在 xaml 页面中试过这样-
<Label.FontFamily>
<OnPlatform x:TypeArguments="x:String">
<OnPlatform.iOS></OnPlatform.iOS>
<OnPlatform.Android>Lobster-Regular.ttf#Lobster-Regular</OnPlatform.Android>
<OnPlatform.WinPhone></OnPlatform.WinPhone>
</OnPlatform>
</Label.FontFamily>
new Label {
Text = "Hello, Forms!",
FontFamily = Device.OnPlatform (
null,
null,
@"\Assets\Fonts\Lobster-Regular.ttf#Lobster-Regular"
// Windows Phone will use this custom font
)
}
但是当我 运行 我的应用程序字体没有设置为 Windows 10 和 8.1。
如何为 windows 10 和 8.1 设置字体系列。 或者有没有更有效的方法来应用覆盖所有平台的字体系列?
您可以尝试创建一个 CustomRenderer
来覆盖 Windows 平台上的 Xamarin.Forms.Label
,如下所示:
[assembly: ExportRenderer(typeof(Xamarin.Forms.Label), typeof(MyLabelRenderer))]
namespace MyApp.CustomRenderers.Controls
{
public class MyLabelRenderer : LabelRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
{
base.OnElementChanged(e);
if (Control != null)
{
var font = new FontFamily(@"\Assets\Fonts\Lobster-Regular.ttf#Lobster-Regular");
if (e.NewElement != null)
{
switch (e.NewElement.FontAttributes)
{
case FontAttributes.None:
break;
case FontAttributes.Bold:
//set bold font etc
break;
case FontAttributes.Italic:
//set italic font etc
break;
default:
break;
}
}
Control.FontFamily = font;
}
}
}
注意:如果您使用的是 NavigationPage
,则 custom fonts do not work 存在错误在 Windows 8.1/UWP 上,您不需要自定义字体的自定义渲染器; Xamarin 示例代码只是有几个错误:
- 改用正斜杠 ('/')
- 路径应该是
[font file]#[font name]
的形式(没有字体样式,例如'regular')
所以本例中的路径实际上应该是
"Assets/Fonts/Lobster-Regular.ttf#Lobster"
您也可以在 Xaml
中使用它<OnPlatform.WinPhone>Assets/Fonts/Lobster-Regular.ttf#Lobster</OnPlatform.WinPhone>
确保你的字体文件包含在你的项目中 BuildAction:Content
并且它应该可以工作。