« 2015年5月 | トップページ | 2015年9月 »

2015年7月の記事

2015年7月12日 (日)

新骨言道、あるいは、WPFが言語を意識してフォントを切り替えているらしい件

 WPFには Language という dependency property (日本語では「依存関係プロパティ」と言うらしい) がある。このあたりに説明があるが、これを読んでも、どういう働きをするのかさっぱりわからない。

それで、ふと思いついてサンプルプログラムを書いてみたところ、どうやら font fallback (日本語では「フォンント フォールバック」と言うらしい) の選択に使っているらしい。いや、他にも使っているのかもしれないが。

と、いうことで、これがサンプル。(例によって、画像をクリックすると拡大します。)

Wpf1

バリバリのWPFプログラマーの皆さんには常識だったりするのかもしれないが、そういう層と、こういう地域による漢字の字体差に関心がある層との間にはかなり距離があるような気がする。後者の人たちは、マイクロソフトがどういう努力をしているか全然知らないんじゃないかという気もする。このサンプルを見て面白がっていただければ幸いです。

さて、プログラマ的には、見所は、

  • XAML の Label 要素には、それぞれ異なる Language 属性を指定しているが、フォントに類するものは指定していない。
  • フォントの指定は Window 要素に対して行っており、そこに FontFamily="Arial" と書いてある。

というあたり。

後者がどうして見所なのかというと、次のスクリーンショットを見るとわかる。

Wpf2

こちらは、Language の値によらず同じ表示になっているが、XAML 上の違いは、WindowFontFamily を削除しただけ。なぜ、そうなるのか、よくわかっていないのだが、どうやら Label/@Languageの働きは、最初からフォントを選ぶわけではなくて、フォント フォールバックに影響を与えるだけらしい、という気がする。

Visual Studio で WPF アプリの XAML 書いている人は先刻ご承知と思うが、Visual Studio のウィザードが生成する雛形 XAML には、FontFamily 属性はついていない。FontFamily 属性を指定していない XAML の要素のプロパティを Visual Studio で見ると、FontFamily のデフォルトは Meirio UI である、と表示される。(日本語 Windows で開発している場合。) この、「デフォルトは Meiryo UI」ということの意味も、よくわからないのだが、これは「実行時には Meiryo UI が使われる」ということではなくて、「FontFamily として Meiryo UI が指定されているものとみなす」ということのようだ。そうでないと、ここで観察した動作は説明できないように思う。

つまり、FontFamily="Arial" があると、各 Label では Arial を使って「新骨言道」と表示しようとするが、Arial というフォントにはそんな文字は含まれていない。それでフォント フォールバックの仕組みが働き、Language の値を参照してフォントを選択する。他方、FontFamilyがないと、まず FontFamily のデフォルト値として Meiryo UI が採用され、各 Label は Meiryo UI を使って「新骨言道」と表示しようとする。Meiryo UI にはこの4文字が含まれるのでフォント フォールバックの仕組みは働かず、Langauge が参照されることもない。そういうことなのだろうと思う。

いわゆる英語版のウィンドウズでは、フォントのデフォルトは Meiryo UI ではない。Segoe UI になるはずだ。Segoe UI にも、「新骨言道」は含まれない。ということは、上の 2 個目のサンプル プログラムは、完全に同一の XAML であっても、英語版の Windows で開発すると、1 個目のサンプルと同じ表示になるのだろうか。それとも、開発した環境じゃなくて、実行した環境によって、つまり 2 個目のサンプル プログラムは、英語版の Windows で実行すると、1 個目のサンプルと同じ表示になるのだろうか。いずれにしても気持ち悪いし、前者ならまだしも、後者だとすると、これはサポート担当者には悪夢じゃなかろうか。(この悪夢を避けるためには、Language 属性の使用を禁止するだけでいいのだろうが。

ちなみに、WPF ではデフォルトのフォントはどうやって決まるのか、という点は、世界中のプログラマを悩ませている謎のようだ。英語でそれっぽい検索をすると、様々な驚くべき現象に出会った人たちがみつかる。MSDN のサポート フォーラムにも似たような質問が多数ある。マイクロソフト側の人の回答は大抵の場合「様々な要因によって最適なものが選択されます」みたいな、意味がわからないものだ。たぶん、回答している人にもよくわかってないんじゃないかと思う。

« 2015年5月 | トップページ | 2015年9月 »