WPFでttfアイコンフォントを使用する

WPFでttfアイコンフォントを使用する

ベクターグラフィックをフォント形式にパッケージ化し、通常のフォントと同じように使用できます。アイコンのサイズや色を自由に設定できます。従来の画像と比較して、メリットは明らかです:

最終更新 2021/12/20 0:21
丑萌气质狗
読了目安 3 分
カテゴリ
WPF
タグ
.NET WPF

アイコンとは

ベクターグラフィックスをフォントの形式にパッケージ化したもので、フォントと同じように使用でき、アイコンのサイズや色を自由に設定できます。従来の画像と比較して、以下のような明確な利点があります。

  1. ファイルサイズが小さく、読み込み速度が速く、パフォーマンスが高い
  2. ベクター(自由に拡大縮小でき、歪まない)
  3. 柔軟性(コードでアイコンの色を変更可能)

しかし、フォントと同様に、いくつかの欠点もあります。

  1. 以前のデザインとの互換性が難しく、置き換え作業の負荷が大きい
  2. デザイナーのデザイン案に合わせることが難しく、調整とコミュニケーションのコストがやや高い

よく使われるアイコンフォント

まずおすすめするのはAlibaba Vector Icon Libraryです。ここには多くのソリューションと完成されたアイコンセットがあり、いろいろ試せます。以前はログインするだけでよかったのですが、今は電話番号認証が必要なようで、少し面倒です。

次にFont Awesome アイコンがあります。こちらは旧版と新版(V5版またはPro版)に分かれており、旧版は無料ですがアイコン数は少なめです。

Microsoftは現在2種類提供しています。1つはWindows10のSegoe MDL2 Assets アイコン、もう1つはWindows11のSegoe Fluent アイコンです。

GoogleにはオープンソースのMaterial Design iconsアイコンフォントがあります。以前はローカルにダウンロードできたのですが、今は見つかりません。Material Design icons by Google

残りは省略します。アイコンフォントはたくさんあるので、自分で検索してみてください!

WPFでアイコンフォントを使用する方法

この例ではMicrosoftのSegoe MDL2 Assets アイコンを使用します。下図はサイト上のアイコンフォントの一部を示しており、Unicodeコードポイントが表示されています。これはこのフォントを識別するもので、後でフォントを表示するためにも使用します。

フォント表示

Windows10での適用方法

このアイコンフォントはWindows10に標準で組み込まれているため、FontFamilyプロパティをSegoe MDL2 Assetsに設定するだけでアイコンのサポートを得られます。

<TextBlock
  FontFamily="Segoe MDL2 Assets"
  FontSize="50"
  Foreground="Red"
  Text="&#xE702;"
/>

Textは説明文にあるUnicodeコードポイントで構成されていますが、テキストの前に&#x、後ろにセミコロン;を付ける必要があります。完全なものは"&#xE702;"です。

フォントファイルを参照する方法

ただし、この方法はWindows10システムでのみ動作します。他のシステムでは表示されない可能性があるため、Segoe MDL2 Assetsアイコンフォントをダウンロードし、ダウンロードした圧縮ファイルからSegMDL2.ttfをプロジェクトにコピーします。管理を容易にするために、プロジェクト内に新しく作成したFontsフォルダに配置します。

次に、SegMDL2.ttfを選択し、プロパティパネルでビルドアクションリソースに変更します。これにより、このファイルはリソースとしてWPFプログラムに含まれます。

アイコンフォントの使用方法は上記と同じですが、外部フォントとしてWPFプログラムに追加しているため、FontFamilyに設定するプロパティ値には注意が必要です。一般的にはpack://application:,,,/プロジェクト名前空間;component/フォントパス/フォントファイル名#フォント実際の名前と表現できます。以下で一つずつ説明します(後でカスタムリソースファイルを参照する場合もこのルールに従いますが、#フォント名は不要です。詳細は下記参照)。

プロジェクト名前空間:特に変更していなければ、プロジェクト名前空間はプロジェクト名と同じです。私のプロジェクト名はWPF_Blog_Testなので、名前空間も同様です。プロジェクト名前空間がわからない場合は、XAMLファイル(例:プロジェクトのApp.xaml)を開き、x:Class属性、またはコードビハインドクラスのnamespaceを確認してください。

フォントパス/ファイル名:フォントファイルはFontsフォルダに配置しているので、私のフォントパスとファイル名はFonts/SegMDL2.ttfです。ファイル名については注意点があり、プロパティに表示されているファイル名を使用する必要があります。

フォント実際の名前:フォントの実際の名前は、フォントをダブルクリックして開くことで確認できます(VSで開くとバイトコードが表示されるので、Windowsのフォルダでファイルを選択してダブルクリックして開いてください)。ここではSegMDL2.ttfの実際の名前はSegoe MDL2 Assetsです。

したがって、FontFamily"pack://application:,,,/WPF_Blog_Test;component/Fonts/SegMDL2.ttf#Segoe MDL2 Assets"と設定します。コードを貼って完了です!

<TextBlock
  FontFamily="pack://application:,,,/WPF_Blog_Test;component/Fonts/SegMDL2.ttf#Segoe MDL2 Assets"
  FontSize="50"
  Foreground="Red"
  Text="&#xE702;"
/>

PS:毎回この長いFontFamilyを書くのが面倒な場合は、リソースで定義してから参照するか、TextBlockアイコンフォントのスタイルを定義することを検討してください(さらに拡張も可能)。既にリソース定義を理解している方は以下をスキップしてください。

カスタムリソース

フォルダStylesを作成し、その下にリソースファイルIconFontsを作成します(Stylesを右クリックし、リソースディクショナリの追加を選択)。デモのために、両方の方法をIconFontsファイルにまとめて記述します。

定義したスタイルを記述します(コードは画像の下)。

<FontFamily x:Key="SegIconFont">
  pack://application:,,,/WPF_Blog_Test;component/Fonts/SegMDL2.ttf#Segoe MDL2
  Assets
</FontFamily>

<style x:Key="tbSegIconFontKey" TargetType="{x:Type TextBlock}">
  <Setter Property="FontFamily" Value="pack://application:,,,/WPF_Blog_Test;component/Fonts/SegMDL2.ttf#Segoe MDL2 Assets" />
  <Setter Property="Foreground" Value="Red" />
  <Setter Property="FontSize" Value="50" />
</style>

この時点ではIconFontsというリソースディクショナリを追加しただけなので、プロジェクトに導入してからでないと画面で使用できません。そのため、App.xamlファイルに参照文を追加して、新しく作成したリソースディクショナリが含まれることをプログラムに知らせる必要があります。文は<ResourceDictionary Source="pack://application:,,,/WPF_Blog_Test;component/Styles/IconFonts.xaml" />です。名前空間とリソースパスのルールは上述の通りです。App.xamlのスクリーンショットを追加します。

残りはプログラム内で使用するだけです。コードを直接示します。

<!--  最も原始的な方法  -->
<TextBlock
  FontFamily="pack://application:,,,/WPF_Blog_Test;component/Fonts/SegMDL2.ttf#Segoe MDL2 Assets"
  FontSize="50"
  Foreground="Red"
  Text="&#xE702;"
/>

<!--  FontFamilyリソースを定義  -->
<TextBlock
  FontFamily="{StaticResource SegIconFont}"
  FontSize="50"
  Foreground="Red"
  Text="&#xE702;"
/>

<!--  TextBlock Styleスタイルを定義  -->
<TextBlock
  FontSize="50"
  Foreground="Red"
  Style="{StaticResource tbSegIconFontKey}"
  Text="&#xE702;"
/>

こんなに多くのスクリーンショットを撮ることになるとは思いませんでしたが、論理が明確であることを願っています。ご覧いただきありがとうございます!

本文は博客園からのもので、著者:丑萌气质狗、原文リンク:https://www.cnblogs.com/choumengqizhigou/p/15550133.html

転載の際は出典を明記してください。QQグループ:560611514

さらに探索

関連読書

その他の記事
同じカテゴリ / 同じタグ 2025/09/13

WPF から Avalonia への移行シリーズ:なぜ WPF プログラムを Avalonia に移行しなければならないのか

過去数年間、当社の上位機ソフトウェアは主に WPF と WinForm で開発されてきました。これらの技術は Windows プラットフォームで非常に便利であり、小規模試作から現在の規模拡大による納品まで、私たちを支えてきました。しかし、ビジネスの発展や顧客ニーズの変化に伴い、単一の Windows テクノロジースタックは私たちが必ず乗り越えなければならない壁となってきました。

続きを読む
同じカテゴリ / 同じタグ 2025/01/26

WPF カスタムXMLファイルによる国際化

この記事では、WPFプログラムでカスタムXMLファイルを使用して国際化を実現する方法について詳しく説明します。必要なNuGetパッケージのインストール、言語リストの動的取得、言語の動的切り替え、コードおよびXAMLインターフェースでの翻訳文字列の使用などを含み、ソースコードのリンクも提供し、開発者がWPFアプリケーションの国際化を簡単に実装できるように支援します。

続きを読む