簡體   English   中英

Xamarin Forms 自定義字體 CrossPlatform

[英]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,您仍然需要在每個平台項目中嵌入字體,如下所述。

  1. 下載 TTF 文件並將它們作為資源與每個平台項目捆綁在一起
  2. 從 Xamarin.Forms 共享項目中引用字體,同時考慮到每個平台的特性(用於尋址資源和字體系列的命名約定)。
  3. 將字體應用於 Xamarin.Forms 控件。

這里詳細介紹了如何在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM