アイコンフォントとは
アイコンのWebフォントです.フォントなのでテキストと同じようにサイズや色を変えることができます.
(雑)
上記のサイトを参考にしてアイコンフォントをXamarin.Formsで使えるようにします.
フォントの入手
以下のサイトからアイコンフォントを入手します.
このサイトでは選択したアイコンを.ttfファイルとして一括でダウンロードすることができます.
各アイコンを1つ1つクリックして選択していくか,もしくは以下のように矩形選択することができます.

選択したら右上の「Download webfont」をクリックしてダウンロードします.
詳しくはこちらのサイトでも説明されています.
zipファイルとしてダウンロードされるので,それを解凍します.
その中に.ttfファイルがあります.必要に応じてファイル名を変更します.

フォントファイルの配置
フォントファイルの配置場所と手順は各プラットフォームごとに異なります.
Android
プロジェクト直下のAssetsフォルダ内にダウンロードした.ttfファイルをコピペやドラッグ&ドロップなりなんなりで追加します.

追加したフォントファイルのプロパティを開いてBuild ActionをAndroidAssetに設定します.

iOS
プロジェクト内のResourcesフォルダ内に.ttfファイルを入れます.
そして,BuildActionをBundleResourceに設定します.

info.plist内に以下を追加します.
<dict> 省略 <!--これ--> <key>UIAppFonts</key> <array> <string>fontello.ttf</string> </array> <!--ここまで--> </dict>
UWP
/Assets/Fontsフォルダに.ttfファイルを入れます.Assetsフォルダ内にFontsフォルダを作成し,その中に入れます.
BuildActionをContentに設定します.

アプリケーションからアイコンフォントを使う準備
各プラットフォームごとに配置した.ttfファイルを参照するように以下の設定をApp.xaml内の<Application.Resources>内に以下を追加します.
<Application.Resources> <!-- ここから --> <OnPlatform x:Key="MyFontFamily" x:TypeArguments="x:String"> <On Platform="iOS" Value="My Icons" /> <On Platform="Android" Value="fontello.ttf#My Icons" /> <On Platform="UWP" Value="Assets/Fonts/fontello.ttf#My Icons" /> </OnPlatform> <!-- ここまで --> </Application.Resources>
iOSはinfo.plistでファイルの位置を指定しているので,名前をつけているだけです.
AndroidとUWPではファイルの位置と名前をしています.
ここまででアイコンフォントを使用する準備が整いました.
アイコンフォントを使用する
それでは使ってみましょう.
<Label FontFamily="{DynamicResource MyFontFamily}" HorizontalOptions="Center" Text="こんにちは,絶対! " VerticalOptions="CenterAndExpand" />
このの部分がアイコンフォントのコードになります.
このコードをどうやって知ればいいのかというと,方法はいくつかあります.
ひとつはダウンロード元のFontelloで以下のようにフォントを選択して「Customize Codes」というタブを開くと,各アイコンのコードをみることができます.

この例ではE804がコードなので,Xaml上ではとなります.
これで実行すると,以下のようにアイコンが表示されます.

フォントですので,FontSizeやTextColorといったプロパティで大きさや色を変更できるので便利です.
<Label FontFamily="{DynamicResource MyFontFamily}" FontSize="Large" HorizontalOptions="Center" Text="こんにちは,絶対! " TextColor="Red" VerticalOptions="CenterAndExpand" />

コードで指定するのはツライ...
コードでアイコンを指定するのはなかなかしんどいものがあります.
そこで,このコードに名前を
Icon font to Codeというウェブサービスがあります.これは.ttfファイルを読み込ませると,各アイコンに対応するコードとそのアイコン名の組み合わせからC#のクラスを生成するものです.
「Browse」ボタンを押して.ttfファイルを指定します.

すると,このようにC#コードが生成されるのでこれを早速クリップボードにコピーします.

共通プロジェクトにこのクラスを追加します.

これをXamlで使用する場合は,そのクラスにアクセスできるように名前空間を追加し,
(こういうやつ)
xmlns:local="clr-namespace:FontImageSourcePractice"
ラベルでもボタンでも単独で使うのであれば,
<Label FontFamily="{StaticResource MyFontFamily}" FontSize="Large" HorizontalOptions="Center" Text="{x:Static local:IconFont.Music}" TextColor="Red" VerticalOptions="CenterAndExpand" />
このようにx:Staticを使ってIconFontクラス内のプロパティを指定します.
このあたりの使い方はXappyのソースコードを参考にしました.
Text="{x:Static local:IconFont.Music}"
では文字列の中で部分的にアイコンフォントを使いたい場合は,最初の例のようにコードで書き込むか,今回の場合では以下のようにSpan要素を使って部分ごとに分けて文字列を組み立てます.
<Label FontSize="Large" HorizontalOptions="Center" TextColor="Red" VerticalOptions="CenterAndExpand"> <Label.FormattedText> <FormattedString> <Span FontSize="Large" Text="こんにちは,絶対!" /> <Span FontFamily="{StaticResource MyFontFamily}" FontSize="Large" Text="{x:Static local:IconFont.Music}" /> </FormattedString> </Label.FormattedText> </Label>
アイコンフォントなので,最も多い用途はアイコンとしてでしょう.
ImageSource型のプロパティをコントロールが持っていれば,そこにFontImageSourceを使って設定することができます.
例えばボタンにアイコンをセットしてみます.
<Button Margin="20" BackgroundColor="Red" CornerRadius="50" HeightRequest="90" HorizontalOptions="Center" VerticalOptions="Center" WidthRequest="95"> <Button.ImageSource> <FontImageSource FontFamily="{StaticResource MyFontFamily}" Glyph="{x:Static local:IconFont.Heart}" Size="44" Color="LightGreen" /> </Button.ImageSource> </Button>

まとめ
このように一度プロジェクトに導入してしまえば後は簡単に使うことができ,とても便利です.
今回のソースコード
おまけ
さて,サンプルの文字列を「こんにちは,絶対」にしていたのは「糸へん」の漢字を表示させて中華フォントで表示されるのかを確認したかっただけです.
スクリーンショットはエミュレータで動作させたもので,糸へんの下部分が3つの点で書かれており,日本語フォントとは異なっていることがわかります.
なので,最後にフォントの指定方法を追記しようかなと思ったのですが,実機で動かしたら日本語フォントが使われました.
フォントの変更についてはまた別で書こうと思います.
手順概要
- フォントの入手(Fontelloなど)
- フォントファイルをプロジェクトに配置(プラットフォームごとに)
- フォントファイルからフォントのコードを取得(IconFont2Code)
- フォントファイルの位置を設定(プラットフォームごとに)(Application.Resources内で)
- StaticResourceとして利用