雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

ライブタイルが中華フォントになってしまう事への対応

twitter 経由で、「 Windows Phone アプリのライブタイルに表示される日本語が中華フォント*1で表示される」と云う話が出ていたので確認してみたところ、確かに Yu Gothic になっていない様です。 一応、私も日本語を表示するライブタイルに対応したアプリを Marketplace に載せているので対応策を考えてみました。

そもそもなぜ日本語が中華フォントになるのか

Windows Phone 7.x のアプリを開発した経験のある方ならご承知の事かと思いますが、 Windows Phone アプリは日本語に対してデフォルトで適用されるフォントが Yu Gothic ではないため、各アプリで対策を講じる必要があります。(この件については、以前記事を書きました。)
しかしながら、この対策を行っていても件のライブタイルは相変わらず中華フォントで表示されてしまいます。

ライブタイルが中華フォント表示になる原因

# ちなみにライブタイルの実装については、過去のトライアスロンキャンペーンの折に Microsoft よりチュートリアルドキュメントが提供されたため、これを基に実装されている方も多いのではないかと思われます(かく言う私もその一人です) ので、このドキュメント (DailyCalendarv1.1.pdf) のコードをベースとして説明します。
そもそも Windows Phone のライブタイルに設定可能なコンテンツは、イメージファイルに限定されています。( Back タイルには文字列を設定可能)
そこで、ライブタイルのレイアウトを任意につくるため、 UserControl を使ってタイルと同サイズの UI を作成し、そのスナップショットをイメージ保存した上でライブタイルのコンテンツとして設定する手法を使用しています。(他にも方法はあると思いますが、少なくともチュートリアルドキュメントではこの方法を採っています)
この際、 UserControl のインスタンスをコード上で生成する(ドキュメント中 P8. 「タイル作成補助機能の実装」)ため、この UserControl はアプリケーションの VisualTree 上には入りません*2
一方で、アプリケーションの言語設定対策は RootFrame (アプリケーション UI の外枠)に対して行っているため、この設定が適用されるのはアプリケーション UI の VisualTree 内のみと云う事になります。
従って、ライブタイル用のコントロールに対しては Yu Gothic が適用されず、中華フォント表示になってしまうと云う事になります。

では、どうするか

ライブタイル用の UserControl に対して個別に Language を指定する必要があります。

DiaryCalendarTile calendarTile = new DiaryCalendarTile();
calendar.Language = XmlLanguage.GetLanguage(CultureInfo.CurrentUICulture.Name);
...

追記

日本語に対して Yu Gothic を適用するのが目的なので、 XAML で直接 Language="ja-JP" 指定をした方がラクとの指摘を高橋忍さんから頂きました。
確かにこの方が手軽ですね。
(ドキュメント中 P5. 「タイル画面の設定」)

<UserControl x:Class="Utility.DailyCalendarTile"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

             FontSize="{StaticResource PhoneFontSizeNormal}"
             Foreground="{StaticResource PhoneForegroundBrush}"
             d:DesignHeight="173" d:DesignWidth="173"
             Language="ja-JP">

※ちなみにこの場合、 UserControl の言語指定が日本 (ja-JP) 固定になりますが、コンテンツが日本語以外の場合でも問題はない様です。*3
※ Language プロパティが DependencyProperty であればデータバインドでいけるんですけどね。。。 :p

*1:「中華フォント」は俗称。正確には CJK 混合フォント、ですかね?

*2:そもそもライブタイルを作成するコードは BackgroundTask として実行されるため、アプリケーション UI の VisualTree 上には入りようがないわけですが。

*3:SGML 原理主義者的には色々と思うところはありますが。。。 ^^;