WPF 標準コントロールデモアプリ › TextBlock
TextBlock Display
TextBlock は、1 つの文字列か書式付きの文字の並びを、読み取り専用で表示します。画面に文字を置く最も軽い方法です。
Text と Inlines は思われているようには混ざらない
TextBlock は Control ではなく FrameworkElement を継承しているので、テンプレートを持ちません。既定ではフォーカスを受け取らず(Focusable は False)、文字を選択することもできません。選択できる読み取り専用の文字の表示方法は、下にリンクした記事で扱っています。
文字の与え方は 2 通りあり、1 つの文字列の Text か、書式付きの文にする Run・Bold・Hyperlink などの Inlines です。最初のレイアウトの前に Inlines(Run と Bold)で内容を作った TextBlock の Text は、レイアウトの前も後も空文字でした。このように作った TextBlock の Text には頼れません。そのあと Text を設定しても例外にはならず、書式付きの並びが 1 つの並びに置き換わりました。
バインドと書式を組み合わせるなら、Run の Text をバインドします。太字の「Name: 」の後に置いてバインドした Run は、バインドした文字を表示し、ソースの変更にも追従しました。
長い語、限られた幅、余白
TextWrapping の既定値は NoWrap です。1 語だけで幅 100 を超える語を含む「Say Supercalifragilisticexpialidocious now」を幅 100 に置くと、NoWrap は 1 行で 100 の位置で切れました。Wrap は長い語そのものを折って 4 行になりました。WrapWithOverflow は語を分けずに 3 行になり、その語が 100 を超えてそこで切れました。端からはみ出させたくないなら Wrap を使います。
TextTrimming を CharacterEllipsis か WordEllipsis にすると、幅の決まった列の名前のように、収まらない文字の末尾が省略記号になります。既定値の None では省略されません。計測では、幅を限る Grid の中では省略され、幅を限らない横の StackPanel の中では省略されませんでした。高さの制限は測っていません。CharacterEllipsis の長い文字は、幅 100 の Grid では幅 100 になりました。幅に制限のない横の StackPanel では本来の幅 220.43 になり、省略されませんでした。
Padding の既定値は 0 です。Padding="10" では、TextBlock が縦横それぞれ 20 大きくなり、61.57 × 15.96 から 81.57 × 35.96 になりました。
| 条件 | 計測値 |
|---|---|
| 基底クラス / Focusable / Padding / TextWrapping、TextTrimming | FrameworkElement / False / 0,0,0,0 / NoWrap, None |
| Inlines に "Hello " + Bold "world": レイアウト前の Text / レイアウト後 | "" / "" |
| 続けて Text = "Replaced": 例外 / Inlines の数 | 例外なし / 1 |
| Bold "Name: " の後の Text をバインドした Run: Run.Text / 変更後 | "bound" / "changed" |
| "Say Supercalifragilisticexpialidocious now"、幅 100: 行数 | NoWrap 1、切り取られる / Wrap 4 / WrapWithOverflow 3、切り取られる |
| CharacterEllipsis: 幅 100 の Grid の中の幅 / 横の StackPanel 100 | 100 / 220.43 |
| Padding=10: 大きさ なし / あり | 61.57 x 15.96 / 81.57 x 35.96 |
文字と Inlines、折り返し、省略、余白。.NET 10 / Windows 11 で計測。
デモアプリで行が重なる理由:LineHeight と LineStackingStrategy
LineHeight は各行の高さ、LineStackingStrategy はその当てはめ方です。デモアプリは LineHeight 5 と、コンボボックスの最初の値の BlockLineHeight で始まります。4 行の文字でこの設定だと、高さは 63.84 ではなく 20 になり、行が重なります。MaxHeight では行が文字より低くならず、5 でも高さは 63.84 のままでした。30 ではどちらも 120 でした。行が重ならないよう、LineStackingStrategy="MaxHeight" か文字より大きい LineHeight を使います。
| LineHeight | BlockLineHeight | MaxHeight |
|---|---|---|
| 指定なし(NaN) | 63.84 | 63.84 |
| 5(デモの初期値) | 20 | 63.84 |
| 30 | 120 | 120 |
LineHeight と LineStackingStrategy ごとの、デモアプリの 4 行の高さ。.NET 10 / Windows 11 で計測。
デモアプリで試す

デモアプリの TextBlock のページには、Text、TextWrapping、TextTrimming、TextAlignment、Padding、フォントの各プロパティ、Background、Foreground、LineHeight と LineStackingStrategy の欄があります。Text の欄はテキストボックスにバインドし、TextAlignment の欄は折り返しを有効にして Left・Right・Center・Justify の 4 つの値を並べています。各欄の下の「Show Code」リンクで、その欄の XAML を表示できます。次の XAML は、LineHeight の欄(TextBlockUsageControl.xaml)から、スタイルと周囲の GroupBox を省き、名前空間の宣言を加えたものです。markupextensions はデモアプリ独自のマークアップ拡張の接頭辞です。
<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:markupextensions="clr-namespace:WPFStandardControlDemoApp.Common.MarkupExtensions">
<TextBox x:Name="LineHeightTextTextBox" AcceptsReturn="True"
Text="TEXTBLOCK TEXTBLOCK TEXTBLOCK TEXTBLOCK" />
<TextBox x:Name="LineHeightTextBox" Text="5" />
<ComboBox x:Name="LineStackingStrategyComboBox"
DisplayMemberPath="Name"
ItemsSource="{markupextensions:EnumBindingSource EnumType=LineStackingStrategy}"
SelectedValuePath="Value" SelectedIndex="0" />
<TextBlock x:Name="LineHeightResultTextBlock"
LineHeight="{Binding Text, ElementName=LineHeightTextBox}"
LineStackingStrategy="{Binding SelectedValue, ElementName=LineStackingStrategyComboBox}"
Text="{Binding Text, ElementName=LineHeightTextTextBox}" />
</StackPanel>
関連するコントロールと記事
- Label — フォーカスを移すアクセスキーを持つ見出しです。
- TextBox — 利用者が編集できる、または読み取り専用で選択できる文字です。
- WPFで編集不可のままテキストを選択・コピー可能に表示する方法 — 文字を選択できる必要があるときに使うものを扱います。
- WPF で Label を大量配置すると遅い原因と TextBlock への置き換え指針 — Label と TextBlock の負担の違いを扱います。
ソースコードと計測の方法
このページの既定値、Inlines、バインドした Run、折り返し、省略、Padding、LineHeight の記述は、.NET 10 / Windows 11 で実際に動かして確かめたものです(文字を選択できないことと、デモアプリで示す TextAlignment の値は測っていません)。計測には、このサイトのスクリーンショット生成ツールの TextBlockDemoScene を使いました。TextBlock は Measure と Arrange でレイアウトしました。行数は高さを 1 行の高さで割った値で、「切り取られる」は与えた幅で WPF のレイアウトによる切り抜きが働いたことを表します。大きさはフォントと表示スケールで変わり、計測したマシンでの値です。