[Silverlight, XAML] TextBlock 要素のテキストスタイル指定 (Run 要素)

先日、とあるパートナー様からご質問を頂いた、Silverlight (XAML) の Run 要素について、せっかくですのでこちらのブログでもご紹介しておこうと思います。

【質問】
Expression Blend 2 で TextBlock のテキストを追加/修正すると Run 要素で分割されるのはなぜ?

1. TextBlock を配置

Blend_TextBlock1

この時点では、
<TextBlock Text=”Text Block” />
のように、Text 属性でテキスト文字列が指定されています。

2. 上記の TextBlock に新たにテキストを挿入

Blend_TextBlock2

すると、TextBlock 要素の Text 属性がなくなり、TextBlock 要素の子要素として Run 要素が追加され、その Text 属性にテキスト文字列が設定されます。

<Text Block><Run Text=”Text Block”/><Run Text=”だよ”/></TextBlock>

【回答】 
TextBlock 要素の Text 属性を使ってテキスト文字列を指定できますが、このままだと文字単位でのスタイル指定(太字、斜体など)ができません。そのため、文字を追加したり文字列の一部分だけスタイル指定した時点で、テキスト部分が TextBlock 要素の子要素である Run 要素で設定されるようになります。

例:
<TextBlock Text="あいうえお" />

上記のように「あいうえお」の文字列があった場合、例えばすべての文字を太字にすることはできても、文字単位で「う」だけを太字にすることはできません。

そこで、文字単位でのスタイル指定を可能とするために、Run 要素で文字を分割して文字列を指定するようになっています。

<TextBlock>
<Run Text="あい"/>
<Run FontWeight="Bold" Text="う"/>
<Run Text="えお"/>
</TextBlock>

Blend のエディタでは、文字を修正したタイミングで Run 要素で分割される仕様になっています。

もし、文字単位でスタイル指定する必要がないのでしたら、
<TextBlock Text="あいうえお" />
または、
<TextBlock>あいうえお</TextBlock>
などで、XAML を書き換えても問題ないでしょう。

参考までに、Run 要素の詳細は下記の MSDN ドキュメントに記載されていますので、ご参照ください。
https://msdn.microsoft.com/ja-jp/library/bb980106(VS.95).aspx