C# Xamarin表单:UWP和Windows 8.1中的自定义字体

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><

我正在开发一个应用程序,其中我使用的是font.otf文件。我的应用程序将在android、ios、windows 10和windows 8.1上运行。我需要为我的标签创建样式以设置字体系列。 对于android和ios,我引用了这个

我试着在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
    )
}

普通龙虾。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示例代码只是有几个错误:

  • 改为使用正斜杠(“/”)
  • 路径的格式应为
    [font file]#[font name]
    (不含字体样式,例如“regular”)
因此,本例中的路径实际上应该是

"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示例代码只是有几个错误:

  • 改为使用正斜杠(“/”)
  • 路径的格式应为
    [font file]#[font name]
    (不含字体样式,例如“regular”)
因此,本例中的路径实际上应该是

"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
。请记住,如果要获取所有显示文本的控件,您可能还必须对
条目
搜索栏
执行类似的操作