kazuakix の日記

Windows Phone とか好きです

Windows Phone アプリの中華フォント対策 ー Popup もね

みなさんご存じの通り、日本語の Windows Phone アプリでは正しいフォントを表示するために App.xaml.cs に 1 行だけコードを追加してやる必要があります。

protected override void OnLaunched(LaunchActivatedEventArgs e)
{
    // 省略

    Frame rootFrame = Window.Current.Content as Frame;

    // ウィンドウに既にコンテンツが表示されている場合は、アプリケーションの初期化を繰り返さずに、
    // ウィンドウがアクティブであることだけを確認してください
    if (rootFrame == null)
    {
        // ナビゲーション コンテキストとして動作するフレームを作成し、最初のページに移動します
        rootFrame = new Frame();
        // 中華フォント対策
        rootFrame.Language = Windows.Globalization.ApplicationLanguages.Languages[0]; 

 
これで日本語のフォントが正しく表示されるようになります。

f:id:kazuakix:20140825223342j:plain,w360

たったこれだけの事なので、せめて日本で開発するアプリについては確実に対応しておきたいですね。
 

ところで、Windows Phone 8.1 (WinRT) から Popup という便利なものが使えるようになっています。(すみません、Phone 7 からありました) 任意のコントロールを追加することができて とても有用なコントロールですね。
使い方も あらかじめ XAML に書いておく他に、以下のようにコードで生成する事もできるのですが...*1

private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
    var popup              = new Popup();
    var panel              = new Grid();
    var text               = new TextBlock();

    popup.HorizontalOffset =  30;
    popup.VerticalOffset   = 350;

    panel.Width            = 320;
    panel.Height           =  80;
    panel.Background       = new SolidColorBrush(Colors.White);

    text.Style             = (App.Current.Resources["HeaderTextBlockStyle"]) as Style;
    text.Foreground        = new SolidColorBrush(Colors.Black);  
    text.Text              = "忍花化置画";

    panel.Children.Add(text);
    popup.Child            = panel;
    popup.Closed          += (s, o) =>
    {
        text  = null;
        panel = null;
    };
    popup.IsOpen           = true;
}


これを表示してみるとこんな感じになりました。

f:id:kazuakix:20140825223348j:plain,w360

あれ? フォント対策しているはずなのに...?
 
上記のようなコードで生成した場合、Popup は Frame の子になってないので設定した Language が引き継がれてないんですね。

なので Popup にも Frame と同様のフォント対策をしてやります。

private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
    var popup              = new Popup();
    var panel              = new Grid();
    var text               = new TextBlock();

    // 中華フォント対策
    popup.Language         = Windows.Globalization.ApplicationLanguages.Languages[0]; 

 
これで Popup も正しく表示されるようになりました。

f:id:kazuakix:20140825223353j:plain,w360

*1:その前に こんな面倒な使い方はしないと思いますが...