C# Xamarin表单:UWP和Windows 8.1中的自定义字体
我正在开发一个应用程序,其中我使用的是font.otf文件。我的应用程序将在android、ios、windows 10和windows 8.1上运行。我需要为我的标签创建样式以设置字体系列。 对于android和ios,我引用了这个 我试着在xaml页面中这样做-C# Xamarin表单:UWP和Windows 8.1中的自定义字体,c#,xamarin.forms,portable-class-library,xamarin.uwp,C#,Xamarin.forms,Portable Class Library,Xamarin.uwp,我正在开发一个应用程序,其中我使用的是font.otf文件。我的应用程序将在android、ios、windows 10和windows 8.1上运行。我需要为我的标签创建样式以设置字体系列。 对于android和ios,我引用了这个 我试着在xaml页面中这样做- <Label.FontFamily> <OnPlatform x:TypeArguments="x:String"> <OnPlatform.iOS><
<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
)
}
普通龙虾。ttf#普通龙虾
新标签{
Text=“您好,表单!”,
FontFamily=Device.OnPlatform(
无效的
无效的
@“\Assets\Fonts\Lobster Regular.ttf#Lobster Regular”
//Windows Phone将使用此自定义字体
)
}
但当我运行我的应用程序时,字体并没有为Windows 10和8.1设置
如何为windows 10和8.1设置字体系列。
或者有没有更有效的方法来应用覆盖所有平台的字体系列?您可以尝试在Windows平台上创建一个覆盖
Xamarin.Forms.Label
的CustomRenderer
,如下所示:
[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;
}
}
}
[程序集:ExportRenderer(typeof(Xamarin.Forms.Label)、typeof(MyLabelRenderer))]
命名空间MyApp.CustomRenders.Controls
{
公共类MyLabelRenderer:LabelRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(控件!=null)
{
var font=new FontFamily(@“\Assets\Fonts\Lobster Regular.ttf#Lobster Regular”);
if(例如NewElement!=null)
{
开关(如NewElement.fonttributes)
{
案例属性。无:
打破
大小写字体属性。粗体:
//设置粗体字体等
打破
大小写字体属性。斜体:
//设置斜体字体等
打破
违约:
打破
}
}
Control.FontFamily=font;
}
}
}
您可以尝试创建一个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;
}
}
}
[程序集:ExportRenderer(typeof(Xamarin.Forms.Label)、typeof(MyLabelRenderer))]
命名空间MyApp.CustomRenders.Controls
{
公共类MyLabelRenderer:LabelRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(控件!=null)
{
var font=new FontFamily(@“\Assets\Fonts\Lobster Regular.ttf#Lobster Regular”);
if(例如NewElement!=null)
{
开关(如NewElement.fonttributes)
{
案例属性。无:
打破
大小写字体属性。粗体:
//设置粗体字体等
打破
大小写字体属性。斜体:
//设置斜体字体等
打破
违约:
打破
}
}
Control.FontFamily=font;
}
}
}
注意:如果您使用的是导航页面,则会出现一个错误
对于Windows 8.1/UWP上的自定义字体,您不需要自定义呈现程序;Xamarin示例代码只是有几个错误:
- 改为使用正斜杠(“/”)
- 路径的格式应为
(不含字体样式,例如“regular”)[font file]#[font name]
"Assets/Fonts/Lobster-Regular.ttf#Lobster"
您也可以在Xaml中使用它
<OnPlatform.WinPhone>Assets/Fonts/Lobster-Regular.ttf#Lobster</OnPlatform.WinPhone>
Assets/font/Lobster Regular.ttf#Lobster
请确保您的字体文件包含在项目中,并带有
BuildAction:Content
,它应该可以正常工作。注意:如果您使用的是导航页面,则会出现错误
对于Windows 8.1/UWP上的自定义字体,您不需要自定义呈现程序;Xamarin示例代码只是有几个错误:
- 改为使用正斜杠(“/”)
- 路径的格式应为
(不含字体样式,例如“regular”)[font file]#[font name]
"Assets/Fonts/Lobster-Regular.ttf#Lobster"
您也可以在Xaml中使用它
<OnPlatform.WinPhone>Assets/Fonts/Lobster-Regular.ttf#Lobster</OnPlatform.WinPhone>
Assets/font/Lobster Regular.ttf#Lobster
请确保您的字体文件包含在项目中,并带有
BuildAction:Content
,它应该可以工作。我应该为所有平台创建自定义渲染器吗?这样我就不必为android和ios单独设置它了?从您的示例中,您将ios
和android
上的字体系列设置为null
。但是是的,如果您想为该平台上的所有标签将其设置为不同的值,那么我的方法是为每个平台创建一个CustomRenderer
。请记住,如果您想获得显示文本的所有控件,您可能还需要对Entry
和SearchBar
执行类似的操作。我应该为所有pl创建自定义渲染器吗atforms?这样我就不必为android和ios单独设置它了?从您的示例中,您将ios
和android
上的字体系列设置为null
。但是,如果您想为该平台上的所有标签设置不同的字体,那么我的方法是为每个平台设置一个CustomRenderer
。请记住,如果要获取所有显示文本的控件,您可能还必须对条目
和搜索栏
执行类似的操作