文字列リソースを使うには?[Win 8]WinRT/Metro TIPS

Windowsストア・アプリの画面に表示されるタイトルなどの固定文字列を、多言語化対応などのために、文字列リソースとして別のファイルに分けておく方法を説明。

» 2012年10月25日 09時40分 公開
[山本康彦BluewaterSoft]
WinRT/Metro TIPS
業務アプリInsider

powered by Insider.NET

「WinRT/Metro TIPS」のインデックス

連載目次はこちら

 Windowsストア・アプリ(旧称: Metroスタイル・アプリ)の画面に表示されるタイトルなどの固定文字列は、XAMLコードに直接記述することが多い。そうしておけば、Visual StudioのXAMLデザイナで表示を確認できて便利だからだ。

 しかし、開発プロジェクトの管理の都合で、文字列を別のファイルに分けておきたいこともあるだろう。また、多言語化対応のためには、分けておくことが必須になる。

 そこで本稿では、文字列リソースの作り方と、利用方法を説明する。本稿のサンプルは「Windows Store app samples:MetroTips #10 文字列リソースを使うには?」からダウンロードできる。

事前準備

 Windows 8(以降、Win 8)向けのWindowsストア・アプリを開発するには、Win 8とVisual Studio 2012(以降、VS 2012)が必要である。これらを準備するには、第1回のTIPSを参考にしてほしい。本稿ではWin 8製品版とVS 2012 Expressを使用している。

文字列リソースを作成するには?

 VS 2012のメニューバーの[プロジェクト]−[新しい項目の追加]で、「リソース ファイル (.resw)」を追加する。保存するフォルダはプロジェクト内ならどこでもよいが、ファイル名はデフォルトの「Resources.resw」のままとしておく。

 VS 2012のソリューション・エクスプローラで[Resources.resw]をダブルクリックすると、次の画像のようにリソース・エディタが開く。

リソース・エディタを開いたVS 2012の画面

 [名前]の列に文字列リソースの識別子を、[値]列に実際の文字列を入力する。[コメント]列は空欄のままで構わない。

 なお、「Resources.resw」ファイルはXMLファイルなので、テキスト・エディタなどでも編集可能である。

文字列リソースをコードで読み出すには?

 次のような文字列リソースが定義してあるとする。

名前
Text1 これはコードで設定した文字列です。
文字列リソースの定義例1

 コードからは、Windows.ApplicationModel.Resources名前空間のResourceLoaderクラスを使い、上記の文字列リソースを次のようにして読み出す。

var loader = new Windows.ApplicationModel.Resources.ResourceLoader();
var str = loader.GetString("Text1");


Dim loader = New Windows.ApplicationModel.Resources.ResourceLoader()
Dim str = loader.GetString("Text1")


文字列リソースを読み出すコード(上:C#、下:VB)


文字列リソースをXAMLコードに結び付けるには?

 XAMLコードでは、コントロールにUid属性を付けることで、文字列リソースと結び付けることができる。このとき、文字列リソースの名前は「{Uid}.{プロパティ名}」とする。例えば、「Text2」というUidを持っているコントロールのTextプロパティに結び付けるならば、文字列リソースの名前は「Text2.Text」となる。

 結び付けられるのはTextプロパティに限らない。文字列で指定できるプロパティなら、文字列リソースを使える。例えば、次のような文字列リソースが定義してあるとする。

名前
Text2.Text これはUidで指定された文字列です。
Text2.Foreground Red
文字列リソースの定義例2

 これを次のようにしてUidでXAMLコードと結び付ける。

<TextBlock x:Uid="Text2" Text="Uidで指定" />


文字列リソースを結び付けるXAMLコード


 上のXAMLコードは、XAMLデザイナ上ではデフォルトの色(=白)で「Uidで指定」と表示されているが、実行すると「これはUidで指定された文字列です。」という赤色の表示に変わる(本稿末尾の画像を参照)。

 なお、この例のTextプロパティのように、XAMLコード上の指定と文字列リソースが衝突した場合には、文字列リソースの方が優先される。VS 2012のデザイン画面では結び付けた文字列リソースは表示されないので、このようにデザイン用としてXAMLコードでも指定しておくとよい。

アプリ・バーのボタンに適用するには?

 上記のようにUidで文字列リソースを結び付ける機能は強力だ。しかし、アプリ・バーのボタンなどでは、そのままではうまくいかないことがある。

<Button x:Uid="AddButton" Click="Button_Click"
        AutomationProperties.Name="新規"
        ToolTipService.ToolTip="追加します"
        Style="{StaticResource AddAppBarButtonStyle}" />


アプリ・バーに置いたボタンのXAMLコード
「新規」と「追加します」という文字列を、前述の方法で文字列リソースに置き換えようとしてもうまくいかない。


 上のXAMLコードではUidが「AddButton」となっており、「AutomationProperties.Name」プロパティに文字列リソースを結び付けたいとする。そこで、「AddButton.AutomationProperties.Name」という名前で文字列リソースを作ってみても、残念ながら表示されない。

 このような場合には、次のように角カッコ([])で囲って名前空間を指定しなければならない。それぞれの名前空間は、プロパティの型の所属先である(例えばAutomationPropertiesプロパティの型であるAutomationPropertiesクラスはWindows.UI.Xaml.Automation名前空間に所属している)。

名前
AddButton.[using:Windows.UI.Xaml.Automation]AutomationProperties.Name 追加する
AddButton.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip アイテムを新しく追加します!
角カッコ([])で囲って名前空間を指定する場合の記述例

アプリケーション・マニフェストに適用するには?

 文字列リソースをアプリケーション・マニフェストの項目に適用することもできる。この場合には「ms-resource:」というプロトコルを用いる。

名前
AppName Windows ストア・アプリ TIPS #10
文字列リソースの定義例3

 上のような文字列リソースを定義した後、下の画像のように、VS 2012でPackage.appxmanifestファイルを開いて、[アプリケーション UI]タブの[表示名]欄に「ms-resource:AppName」と指定する。すると、アプリのタイルに表示される名前が「Windows ストア・アプリ TIPS #10」になる。

「ms-resource:」プロトコルでアプリの表示名に結び付ける

 なお、この「ms-resource:」プロトコルを使う方法は、多言語化対応したアプリをWindowsストアに提出するには必須である。

実行結果

 次の画像は、以上の実装をした状態のXAMLコード・エディタ画面だ。XAMLコードに記述されたままの文字列が表示されているところである。

実装後のXAMLエディタ画面

 実行すると、次の画像のように文字列リソースが適用される。

実行画面(部分)
文字列リソースで定義された文字列に置き換わっている。

まとめ

 文字列リソースは、VS 2012のリソース・エディタで作成できる。作った文字列リソースを使うには、コードで読み出す方法、UidでXAMLコードに結び付ける方法、そして、「ms-resource:」プロトコルでマニフェストに結び付ける方法の3とおりがある。次のドキュメントが参考になる。

「WinRT/Metro TIPS」のインデックス

WinRT/Metro TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。