【发布时间】:2016-10-14 09:09:01
【问题描述】:
我正在关注 Xamarin 建议的Fonts Tutorial,以便在每个平台上都有一个自定义下载字体。但是,我遇到了很多问题,我也尝试找到一种方法来做一些事情,但没有找到如何让它发挥作用。
首先,看一下教程并从相关部分开始。 Using a Custom Font
iOS:
它说我们必须将 font.tff 添加到 Resources 文件夹。 然后,我们必须对 Info.plist 做点什么,但是什么?我不确定我必须做什么。
安卓:
Xamarin.Forms for Android 目前不提供将字体设置为自定义字体文件的功能,因此需要自定义渲染器。
CustomLabelRenderer.cs
public class CustomLabelRenderer : LabelRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
{
base.OnElementChanged(e);
System.Diagnostics.Debug.WriteLine(Forms.Context.ApplicationContext.Assets, e.NewElement.StyleId + ".ttf");
if (!string.IsNullOrEmpty(e.NewElement?.StyleId))
{
var font = Typeface.CreateFromAsset(Forms.Context.ApplicationContext.Assets, e.NewElement.StyleId + ".ttf");
Control.Typeface = font;
}
}
}
根据文档,OnElementChanged() 会被调用,但它不会。 Debug.WriteLine() 不显示任何内容。 为什么?
WinPhone 8.1:
我们必须将字体文件添加到应用程序项目中的/Assets/Fonts/ 文件夹并设置Build Action:Content。一旦实现,适用于 Windows Phone 的 Xamarin.Forms 可以通过遵循特定的命名标准引用已添加到项目中的自定义字体。 但是,Font 没有出现在视图上,字体保持标准,为什么?
目前,经过大量搜索,大量尝试......什么都没有......
我正在尝试添加 DIN Condensed Bold 字体
我的 XAML 布局:
<ContentPage.Content>
<AbsoluteLayout BackgroundColor="#235A5E">
<!-- Menu -->
<AbsoluteLayout x:Name="Menu" BackgroundColor="#2F767B"
AbsoluteLayout.LayoutBounds="0,0,1,0.1"
AbsoluteLayout.LayoutFlags="All">
<Label x:Name="label" Text="Connection" TextColor="White" FontSize="30" VerticalOptions="Center" HorizontalOptions="Center"
AbsoluteLayout.LayoutBounds="0.5, 0, 0.8, 1"
AbsoluteLayout.LayoutFlags="All"/>
<Button x:Name="ConnectionButton" BackgroundColor="Transparent" BorderColor="Transparent"
AbsoluteLayout.LayoutBounds="1, 0.5, 0.2, 1"
AbsoluteLayout.LayoutFlags="All"/>
</AbsoluteLayout>
</AbsoluteLayout>
</ContentPage.Content>
所以Label的FontFamily属性可以这样设置
<Label Text="Hello World !" FontFamily="DIN Condensed Bold"
但是,正如教程中所说,对于 WinPhone 示例,它必须通过另一种方式完成,所以我尝试通过 C# 部分更改 FontFamily。
public partial class MyPage : ContentPage
{
public string FontFamily { get; set; }
public MyPage()
{
InitializeComponent();
label.FontFamily = Device.OnPlatform(
iOS: "DIN Condensed Bold",
Android: "DIN Condensed Bold",
WinPhone: @"Assets\Fonts\DINCondensedBold.ttf#DIN Condensed Bold"
);
}
}
这也不起作用!我还看到了有关 XAML 部分的一些有趣的东西。我希望(f FontFamily 有一天可以工作......)有一个defintion,我们让我能够只编辑一个字段字符串来设置我页面的所有 Label 的 FontFamily。
<ContentPage.Resources>
<ResourceDictionary>
</ResourceDictionary>
</ContentPage.Resources>
我看到我可以为 MyPage.xaml 的所有 Label 定义一个 FontFamily,它是如何工作的?
我也是 MVVM 的新手,但我尝试将我的 public string FontFamily { get; set; } 绑定到 xaml <Label Text="Hello World !" FontFamily="{Binding FontFamily}"/> 中定义的标签,但又一次,没有成功..
我完全被困住了...谁能帮助制作教程或解释我在教程后提到的每件事。感谢您的帮助!
【问题讨论】:
-
阅读该指南链接的博客条目,它对修改 info.plist 有更详细的描述
-
您也可以尝试一次解决这个平台 - 因为您将多个问题打包到一个帖子中,很难简明扼要地回答
-
感谢您的回答。好的,对于其他人(Android/WinPhone)为什么它不起作用?我只想为遇到相同问题的人提出一个有用的问题/答案
-
我也遇到过类似的问题,请仔细检查文件名和字体名称是否相同,字体名称是否区分大小写。
-
谢谢 ;) 现在它适用于 Android,但不适用于 WinPhone 8.1...
标签: fonts cross-platform xamarin.forms