[英]Xamarin Forms Custom Fonts CrossPlatform
我正在按照Xamarin提出的字體教程在每個平台上下載自定義字體。 然而,我遇到了很多問題,我也試圖找到一種方法來做一些事情,但沒有找到如何使它工作。
首先,查看教程並從相關部分開始。 使用自定義字體
IOS:
它說我們必須將font.tff添加到Resources 文件夾中。 然后,我們必須對 Info.plist 做一些事情,但是怎么辦? 我不確定我必須做什么。
安德羅伊德:
適用於 Android 的 Xamarin.Forms 當前不公開將字體設置為自定義字體文件的功能,因此需要自定義呈現器。
自定義標簽渲染器.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 可以引用已通過遵循特定命名標准添加到項目中的自定義字體。 但是,字體沒有出現在視圖上,字體保持標准,為什么?
目前,經過大量搜索,大量嘗試......沒有......
我正在嘗試添加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 部分的有趣內容。 我想要(如果 FontFamily 有一天工作......)有一個defintion
我們讓我能夠只編輯一個字段字符串來設置我頁面的所有標簽的 FontFamily。
<ContentPage.Resources>
<ResourceDictionary>
</ResourceDictionary>
</ContentPage.Resources>
我看到我可以為 MyPage.xaml 的所有標簽定義一個 FontFamily,它是如何工作的?
我也是 MVVM 的新手,但我試圖綁定我的public string FontFamily { get; set; }
public string FontFamily { get; set; }
public string FontFamily { get; set; }
在XAML中定義的標簽<Label Text="Hello World !" FontFamily="{Binding FontFamily}"/>
<Label Text="Hello World !" FontFamily="{Binding FontFamily}"/>
但<Label Text="Hello World !" FontFamily="{Binding FontFamily}"/>
,沒有成功..
我完全被卡住了......誰能幫助我制作教程或解釋我在教程之后提到的每一件事。 感謝幫助!
我認為在某些時候,Xamarin Forms 方法甚至比需要自定義渲染器(或效果等)更容易。 首先,有官方指南: https : //developer.xamarin.com/guides/xamarin-forms/user-interface/text/fonts/#Using_a_Custom_Font 。
對我來說,適用於 iOS、Android 和 UWP 的工作解決方案最終是這樣的:
<Label Text="The sly fox jumps over the lazy brown dog.">
<Label.FontFamily>
<OnPlatform x:TypeArguments="x:String">
<On Platform="iOS" Value="OpenSans-Semibold"/>
<On Platform="Android" Value="Fonts/OpenSans-Semibold.ttf#OpenSans-Semibold"/>
<On Platform="UWP" Value="Assets\Fonts\OpenSans-Semibold.ttf#Open Sans"/>
</OnPlatform>
</Label.FontFamily>
</Label>
對於所有三個平台,本示例中的字體文件都存儲在 Fonts 子文件夾中。 您會在上面的 Android 和 UWP (WinPhone) 路徑中看到這一點。 在 iOS 中,plist 條目包含自定義字體的路徑信息。
最難的部分是找出字體名稱/首選字體。 請注意 Android 和 UWP/WinPhone 的“#”后面的差異。 結合試驗和錯誤(Android)並感謝這篇文章幫助指出所需的特異性: http : //www.blendrocks.com/code-blend/2015/01/04/a-complete-guide-to-在您的windows-and-windows-phone-app 中使用自定義字體。
那篇文章中最相關的部分是首選字體名稱的挑剔和不明顯。 Windows 字體查看器(還有 Mac 字體書,順便說一句,afaik)不會向您顯示首選的姓氏。 從文章:
這部分“#Helvetica Neue LT Std”是包含首選系列的后綴。 它是自定義字體工作所必需的。 后綴必須絕對正確,並且區分大小寫。
- 找到它的最簡單方法是使用名為 dp4 字體查看器的工具。 它是免費的,可以在這里下載。 通過程序找到您的字體,轉到信息點擊復制首選系列。
- 不要使用 Windows 內置字體查看器,因為它不會顯示正確的首選字體系列。
編輯:將 OnPlatform 片段更新為當前推薦的語法。
EDIT2:將 WinPhone 平台更改為 UWP 並刪除了 UWP 路徑的前導反斜杠“\\” - 沒有意識到這不適用於 UWP/WinPhone! 還修復了 dp4 字體查看器的下載鏈接,因為它現在需要“https”。
2020 更新,Xamarin.Forms 4.5 支持在一個地方嵌入自定義字體(共享 UI 項目)並通過 ExportFont 屬性導出: https ://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/text /fonts#use-a-custom-font - 適用於 iOS、Android 和 UWP。 對於 macOS 和 WPF,您仍然需要在每個平台項目中嵌入字體,如下所述。
這里詳細介紹了如何在 macOS、WPF 和 Android 中添加和應用自定義字體。
從 Xamarin.Forms 4.5.530 及更高版本開始,無需指定平台,也無需向每個本機項目(Android、iOS 和 UWP)添加字體文件。 強烈推薦Xamarin devblogs文章作為指南。
我的方法:添加自定義字體文件 fx. OpenSans-Regular.ttf,到共享代碼項目中的新文件夾。 添加[assembly: ExportFont("OpenSans-Regular.ttf", Alias = "OpenSans")]
和using Xamarin.Forms;
的命名空間引用using Xamarin.Forms;
到共享代碼項目中的 AssemblyInfo.cs 文件。 然后從 .xaml 文件中的控件引用別名,例如<Label Text="Username" FontFamily="OpenSans" />
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.