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:sys
に System
名前空間を割り当てることで 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>
半角スペースを表示できるテキスト エディターにこれをコピペして確認すれば、指定方法がわかるはず。