アカベコマイリ

HEAR NOTHING SEE NOTHING SAY NOTHING

XAML で複数行の文字列リソースを定義する方法

XAML で複数行の文字列リソースを定義する方法についての覚書。

サンプル プログラム

複数行の文字列リソースを表示するサンプルのプロジェクト一式。ビルドには Visual Studio 2008 SP1、プログラムの実行には NET Framework 3.5 SP1 が必要。

文字列リソースの定義方法

以下のように文字列リソースを定義すると Text.Description という名前の StaticResource として他の XAML から参照できる。

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib">

    <sys:String x:Key="Text.Description">Description text.</sys:String>
</ResourceDictionary>

xmlns:sysSystem 名前空間を割り当てることで sys:String という記述は C# でいうところの System.String を表す。よってこのソースでは System.String 型をもつ Text.Description という名前の StaticResource を定義している事になる。

複数行の文字列

XAML で文字列リソースを定義してみた。今度はそれを複数行にしてみる。

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib">

    <sys:String x:Key="Text.Description">Line 1.
Line 2.</sys:String>
</ResourceDictionary>

このリソースを TextBlock.Text などに設定しても実際の表示は単一行になってしまう。TextBlock の子として文字列を設定する場合は LineBreak 要素で改行を制御可能だが、文字列リソースはコントロールではないため指定できない。また \n\r\n のような改行指定も単なる文字として表示されてしまう。

これでは実用性に乏しいので、改行を指定する方法について調べてみた。

改行を入れる

調査の結果、以下に解説されている方法で改行を指定できるようになった。

このページのフォーラムに提示された方法を引用する。

If I understand your question correctly, you need to define pure System.String resource in XAML, if this is the case, you could try something like the following snippet: xml <Window.Resources> <System:String x:Key="TwoLiner" xml:space="preserve">First line Second line</System:String> </Window.Resources> The xml:space attribute here means that we want to preserve the white space when parsing, and " " XML entity means "\n"(aka newline character).

上記 XAML のように xml:space を preserve に設定した上で改行したい文字列の終端に半角スペースを入れる。するとそこまでが行となる。この方法により複数行の文字列リソースを表示するプログラムを実行したところ、以下のように改行が行われる事が確認できた。

スクリーン ショット

このサンプルのように空行を入れるなら半角スペースだけの行を定義すれば良い。使用しているリソースの XAML は以下となる。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:sys="clr-namespace:System;assembly=mscorlib">

    <sys:String x:Key="Text.One" xml:space="preserve">一行目。 

二行目 間に半角スペース 
三行目</sys:String>

    <sys:String x:Key="Text.Two" xml:space="preserve">First line 
Second line 

Third line</sys:String>

</ResourceDictionary>

半角スペースを表示できるテキスト エディターにこれをコピペして確認すれば、指定方法がわかるはず。