This article is currently in the process of being translated into Japanese (~86% done).
The TextBlock control
TextBlockはControlクラスを継承していないので、正確な意味においてはコントロールではありません。しかしWPFフレームワークの他のコントロールとほぼ同じように使われているので、簡単のためコントロールと呼びます。
TextBlockコントロールはWPFのコントロールで最も基本的で、かつ使いやすいコントロールです。これはLabelコントロールと同様に画面にテキストを表示しますが、簡単でリソースをあまり消費しません。一般的に、Labelは一行の短いテキスト(画像なども)を扱います。一方TextBlockは複数行の文字列についても非常にうまく機能しますが、文字列のみを扱います。LabelとTextBlockはそれぞれ独自の利点があるので状況に応じて使い分けます。
"Hello, WPF!"記事で既にTextBlockを扱っていますが、ここでは、最も簡単な形式のTextBlockを見てみましょう。
<Window x:Class="WpfTutorialSamples.Basic_controls.TextBlockSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TextBlockSample" Height="100" Width="200">
<Grid>
<TextBlock>This is a TextBlock</TextBlock>
</Grid>
</Window>
これは同じように簡単で、このチュートリアルの以前の章を読んでいれば何も新しものは無いはずです。TextBlockのテキストはTextBlockのTextプロパティを設定するための単純なショートカットです。
次の例ではより長いテキストをTextBlockがどのように処理するのか見てみましょう。少しだけよく見えるようにマージンも加えています。
<Window x:Class="WpfTutorialSamples.Basic_controls.TextBlockSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TextBlockSample" Height="100" Width="200">
<Grid>
<TextBlock Margin="10">This is a TextBlock control and it comes with a very long text</TextBlock>
</Grid>
</Window>
長い文字列への対応
スクリーンショットを見ればすぐわかるように、TextBlockは長いテキストや複数ラインに完全に対応しているけれども、デフォルトでは何もしてくれません。この場合、ウィンドウの内部に表示しきれないほどテキストが長いので、WPFは出来るだけ多くを表示し、残りは表示しません。
幸いなことに、これに対応する方法がいくつかあります。次の例でその方法全てを示し、それぞれについて説明します。
<Window x:Class="WpfTutorialSamples.Basic_controls.TextBlockSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TextBlockSample" Height="200" Width="250">
<StackPanel>
<TextBlock Margin="10" Foreground="Red">
This is a TextBlock control<LineBreak />
with multiple lines of text.
</TextBlock>
<TextBlock Margin="10" TextTrimming="CharacterEllipsis" Foreground="Green">
This is a TextBlock control with text that may not be rendered completely, which will be indicated with an ellipsis.
</TextBlock>
<TextBlock Margin="10" TextWrapping="Wrap" Foreground="Blue">
This is a TextBlock control with automatically wrapped text, using the TextWrapping property.
</TextBlock>
</StackPanel>
</Window>
説明をわかりやすくするため、3つの異なる色(Foregroundプロパティを使用)のTextBlockコントロールを示します。これらはそれぞれ異なる方法で長すぎるテキストに対応しています。
赤い TextBlockはLineBreakタグを使い、設定した場所でマニュアルで改行しています。これはテキストを改行したい場所で直接改行できますが、ほとんどの場合あまり柔軟性がありません。ユーザーがウインドウを大きくした時、1行で表示できる十分な場所があってもテキストは同じ場所で折り返します。
青のTextBlockはコントロールに入り切らないテキストに省略記号をつけるためにTextTrimmingプロパティにCharacterEllipsisを使っています。これは表示する十分な場所がないとき、もっとテキストが続いていることを示す一般的な方法です。長すぎるテキストだけれども1行以上を使いたくない場合に有効です。CharacterEllipsisの代わりに WordEllipsisを使えば、表示可能な最後の文字で切り取る代わりに、ワード単位で切り取ります。これによってワードの一部だけが表示されるのを防げます。
青のTextBlockはTextBlockがテキストを次の行に折り返すようにTextWrappingプロパティにWrapを使っています。マニュアルでテキストを折り返した最初のTextBlockとは対象的に、これは完全に自動で行われるのでより良いです。つまりTextBlockの空間が増減しても直ちに自動的に調整されます。サンプルのウィンドウを拡大・縮小してどのように折返しが更新されるか、いろいろな場合で試して下さい。
ここではTextBlockで単純文字列を扱うことのみでした。次の章ではTextBlockのもっと高度な機能を見ていきます。これによりTextBlockで多様なスタイルのテキストを作り出せます。