2016-06-13 117 views
2

我遵循由Xamarin建議的Fonts Tutorial在每個平臺上具有自定義下載的字體。然而,我遇到了很多問題,我也試圖找到一些方法來做一些事情,但沒有找到如何使它工作。Xamarin Forms自定義字體CrossPlatform

首先,看看教程,並從有關部分開始。 Using a Custom Font


的iOS:

它說,我們必須將font.tff添加到資源文件夾然後,我們必須對Info.plist做些什麼,但是什麼?我不確定要明白我必須做什麼。

安卓:

Xamarin.Forms爲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/文件夾中的應用程序項目,並設置生成操作:內容。一旦實現,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> 

因此,標籤的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,我們只需編輯一個字段字符串即可設置我的頁面的所有Label的FontFamily。

<ContentPage.Resources> 
    <ResourceDictionary> 

    </ResourceDictionary> 
</ContentPage.Resources> 

我看到了,我也許能定義的FontFamily所有MyPage.xaml的標籤的,它是如何工作的?

我也是一個關於MVVM新手,但我想我綁定到public string FontFamily { get; set; }在XAML <Label Text="Hello World !" FontFamily="{Binding FontFamily}"/>但有更多的時間定義的標籤,沒有成功..

我完全以卡住了...誰受得了在教程之後,幫助編寫教程或解釋我提到的每件事情。感謝您的幫助!

+1

閱讀該指南鏈接的博客條目,它更詳細地描述了修改info.plist – Jason

+0

您也可以嘗試一次處理這一個平臺 - 因爲它有多個問題打包到一個文章中,這很難精確地回答。 – Jason

+1

感謝您的回答。對於其他人(Android/WinPhone),爲什麼它不起作用?我只是想爲有相同問題的人做一個問題/答案有用 – Emixam23

回答

14

我認爲在某種程度上,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="WinPhone" Value="\Assets\Fonts\OpenSans-Semibold.ttf#Open Sans"/> 
      </OnPlatform> 
     </Label.FontFamily> 
    </Label> 

對於所有三個平臺在這個例子中,字體文件存儲在字體子文件夾。你會發現它反映在上面的Android和UWP(WinPhone)路徑中。在iOS中,plist條目將路徑信息保存到自定義字體中。

最難的部分是搞清楚字體名稱/首選字體。注意Android和UWP/WinPhone的「#」之後的區別。試用和錯誤(Android)的組合,並感謝這篇文章幫助指出所需的特殊性:http://www.blendrocks.com/code-blend/2015/01/04/a-complete-guide-to-working-with-custom-fonts-in-your-windows-and-windows-phone-app

該文章最相關的部分是如何挑剔和不明顯的首選字體名稱可以。 Windows字體查看器(和Mac字體書也是,btw,afaik)不會顯示您的首選姓氏。從文章:

這部分「#Helvetica Neue LT標準」是一個後綴包含 首選家庭。這是自定義字體工作所必需的。 後綴必須絕對正確,並區分大小寫。

  • 找到它的最簡單方法是使用名爲dp4字體查看器的工具。它是免費的,可以找到downloaded here。通過該程序找到您的字體 ,轉到信息點擊複製首選家庭。
  • 請勿使用內置字體查看器的Windows,因爲它不會顯示正確的首選字體系列。

編輯:將OnPlatform片段更新爲當前推薦的語法。