shuhelohelo’s blog

Xamarin.Forms多めです.

Xamarin.Formsで共有プロジェクトに置いたフォントを使う

Xamarin.Forms 4.5からEmbedded Fontsというプレビュー版の機能があって,これはどういうものかというと,これまでフォントを追加する場合は各プラットフォームのプロジェクト内にフォントファイルを配置する必要がありましたが,フォントファイルを共有プロジェクト内に1つ置くだけで使える,というものです.

docs.microsoft.com

これまではAndroidで正しく動かない場合があったりもしましたが,Xamarin.Forms 4.5.0.530では解消されています.

利用手順

手順は以下のとおりです.

  1. フォントを入手する.
  2. フォントファイルを共有プロジェクト内に置く.
  3. フォントファイルのビルドアクションをEmbedded Resourceにする.
  4. AssemblyInfo.csに使用するフォントを記述する.
  5. 追記:AssemblyInfo.csでなくてもよい.
  6. 例えばApp.xaml.csでも良いようだ.
[assembly: ExportFont("Lato-Black.ttf", Alias = "LatoBlack")]
[assembly: ExportFont("Lato-Bold.ttf", Alias = "LatoBold")]
[assembly: ExportFont("Lato-Regular.ttf", Alias = "LatoRegular")]
[assembly: ExportFont("fa-regular.otf", Alias = "FontAwesomeRegular")]
[assembly: ExportFont("fa-solid.otf", Alias = "FontAwesomeSolid")]

namespace TravelMonkey
{
    public partial class App : Application
    {

フォントの入手

ttf(またはotf?試していない)ファイルを入手します. 入手先は参考までに↓. shuhelohelo.hatenablog.com

フォントファイルを共有プロジェクト内に置く

ソリューションエクスプローラで,共有プロジェクト内にドラッグアンドドロップすればOKです.

f:id:shuhelohelo:20200405144737p:plain

上のように適当なフォルダを作成してその中にフォントファイルを配置するのは自由ですが, プログラム的には特に意味は持ちません.

f:id:shuhelohelo:20200310201352p:plain

ファイルの置き場所については,公式ドキュメントにもあるように,任意のフォルダでよいとのことです.

f:id:shuhelohelo:20200310201803p:plain

フォントは、共有プロジェクト内の任意のフォルダーに置くことができます。フォントをアセンブリに登録するときにフォルダー名を指定する必要はありません。

利用する上でもフォルダを指定することはなく,フォントファイル名を指定するだけなので,開発者が管理がしやすいぐらいのメリットです.

フォントファイルのビルドアクションをEmbedded Resourceにする

ソリューションエクスプローラで,フォントファイルを右クリックしてコンテキストメニューからプロパティを選択します.

そして,ビルドアクションをEmbedded Resourceにします.

f:id:shuhelohelo:20200405145603p:plain

AssemblyInfo.csに使用するフォントを記述する

共有プロジェクト内にAssemblyInfo.csというファイルがあるので,その中に以下のように使用するフォントについて記述します.

[assembly: ExportFont("Bellota-Regular.ttf")]

または別名をつけることもできます.

[assembly: ExportFont("Bellota-Regular.ttf",Alias ="Bellota")]

配置したフォルダは関係ありません.

Embedded Resourceに設定したことで,プロジェクトファイルにフォントファイルのパスが登録されるからです.

f:id:shuhelohelo:20200405145906p:plain

利用する

利用するときは以下のようにFontFamilyにフォントファイル名を指定します.

または,AssemblyInfo.csで別名を指定した場合は,その別名を指定します.

        <Label
            FontFamily="Bellota-Regular"
            HorizontalOptions="CenterAndExpand"
            Text="Hello Embedded Fonts"
            VerticalOptions="CenterAndExpand" />

f:id:shuhelohelo:20200405150428p:plain

ソースコード

github.com