WPF 標準コントロールデモアプリ › TextBox
TextBox Inputs
TextBox はユーザーがテキストを入力・編集できる最も基本的な入力コントロールです。単一行・複数行モード、テキストの折り返し、読み取り専用モード、テキスト選択のカスタマイズをサポートします。
概要
WPF の TextBox は TextBoxBase を継承したテキスト入力コントロールです。Text プロパティを ViewModel の string プロパティに TwoWay バインドするのが標準的な MVVM パターンです。
AcceptsReturn="True" にすると Enter キーで改行できる複数行テキストボックスになります。TextWrapping="Wrap" と組み合わせると、コンテンツが幅を超えた場合に自動で折り返します。垂直スクロールバーは VerticalScrollBarVisibility="Auto" で追加できます。
リアルタイム入力検証や検索フィルタリングなど、入力のたびに処理が必要な場合は UpdateSourceTrigger="PropertyChanged" を使います。これにより、フォーカスを失ったときではなく文字を入力するたびにバインドソースが更新されます。
IsReadOnly="True" にするとユーザーがテキストを編集できなくなりますが、テキストの選択・コピーは可能な点が TextBlock との大きな違いです。読み取り専用でも選択してコピーできる TextBox は、エラーメッセージや技術情報の表示に便利です。
画面キャプチャ

デモしているプロパティ
以下のプロパティが WPF 標準コントロールデモアプリでインタラクティブにデモされています。
| プロパティ | 設定値 | 説明 |
|---|---|---|
Text | string | テキストボックスに表示・編集するテキストを設定します。ViewModel の string プロパティに Mode=TwoWay でバインドするのが標準的な MVVM パターンです。フォーカスを失った瞬間にバインドソースが更新されますが、リアルタイム検証や検索フィルターには UpdateSourceTrigger=PropertyChanged を追加して文字入力ごとに更新させます。はまりポイント: UpdateSourceTrigger=PropertyChanged を指定すると IME(日本語入力)の変換中でも更新が走るため、確定前の未完成な文字列が ViewModel に届く場合があることを考慮してください。 |
AcceptsReturn | bool | 複数行テキストボックスを実現したい場合に True を設定します。True のとき Enter キーで改行が挿入され、複数行入力が可能になります。デフォルト(False)の単一行モードでは Enter キーはウィンドウの IsDefault="True" なボタン(送信ボタンなど)をアクティブにします。はまりポイント: AcceptsReturn=True にしても縦方向に伸びるだけで縦スクロールバーは出ません。必ず VerticalScrollBarVisibility="Auto" と TextWrapping="Wrap" を一緒に設定してください。 |
TextWrapping | NoWrap / Wrap / WrapWithOverflow | テキストの折り返し方法を設定します。Wrap は単語の境界で折り返し、WrapWithOverflow は単語が幅を超える場合でも単語の途中で折り返します(URL など長い単語を含む場合は WrapWithOverflow が適切です)。NoWrap(デフォルト)では横スクロールが発生するため、横スクロールバーを HorizontalScrollBarVisibility="Auto" と組み合わせるか、横スクロール不要なら Wrap を使います。はまりポイント: NoWrap と TextTrimming は TextBox では効果がありません(TextTrimming は TextBlock 用です)。 |
IsReadOnly | bool | ユーザーにテキストの編集は許可せず、閲覧・コピーだけを許可したい場合に True に設定します。編集操作はブロックされますが、テキストの選択・コピーは引き続き可能です。これは TextBlock(選択・コピー不可)との大きな違いで、エラーメッセージや生成コードの表示に最適です。はまりポイント: デフォルトでは読み取り専用の視覚的なインジケーター(背景色変化など)がありません。ユーザーが気づけるよう、Style で IsReadOnly=True のトリガーを定義して背景色を変えることを検討してください。 |
MaxLength | int | フォームバリデーションや DB の文字数制約に合わせた入力制限が必要な場合に設定します。設定した文字数に達すると、それ以降の入力が無音でブロックされます(エラー表示はされません)。0(デフォルト)は無制限です。はまりポイント: MaxLength は UI レベルのみの制限です。ユーザーがコードビハインドやビヘイビア経由でテキストを設定した場合には制限されないため、必ず ViewModel 側でもバリデーションを実装してください。 |
CaretBrush | Brush | カスタムテーマや高コントラストモードで、テキストカーソル(キャレット)がテーマカラーと同化して見えにくくなる場合に設定します。指定した Brush の色でキャレットが描画されるようになります。はまりポイント: CaretBrush は Windows 10 以降の WPF スタイル(aero2 テーマ)でのみ有効です。古い Windows テーマでは無視されることがあります。 |
SelectionBrush / SelectionOpacity | Brush / double | テーマカラーに合わせた選択ハイライトのカスタマイズが必要な場合に使用します。SelectionBrush で選択範囲のハイライト色、SelectionOpacity(0.0〜1.0、デフォルト 0.4)でその不透明度を設定します。両プロパティを組み合わせることでアクセシブルなコントラスト比を保ちながらテーマカラーに合わせた選択表示を実現できます。はまりポイント: SelectionOpacity を 0 に設定すると選択が完全に見えなくなるためアクセシビリティが著しく低下します。 |
ScrollToEnd() / ScrollToHome() / LineDown() | methods | ログビューアーやチャット画面など、コンテンツが追加されるたびに最新行を自動表示したい場合に使用します。ScrollToEnd() で末尾、ScrollToHome() で先頭、LineDown() で1行下にスクロールします。はまりポイント: これらのメソッドは UI スレッドから呼び出す必要があります。バックグラウンドスレッドからログを追加した後に呼び出す場合は Dispatcher.Invoke() または Dispatcher.BeginInvoke() でラップしてください。 |
VerticalScrollBarVisibility / HorizontalScrollBarVisibility | Disabled / Auto / Visible | スクロールバーの表示方法を制御します。Auto はコンテンツがコントロールのサイズを超えた場合にのみスクロールバーを表示し、最もスッキリした UI になります。Visible は常にスクロールバーを表示し(コンテンツが少ない時でもスクロールバー領域が確保される)、Disabled はスクロールを完全に無効にします。はまりポイント: Visible を設定すると、コンテンツが少なくてスクロールが不要な場合でも常にスクロールバーが表示されてレイアウトが崩れて見えることがあります。通常は Auto が最適です。 |
XAML 使用例
<!-- 単一行テキストボックス -->
<TextBox Text="{Binding Name, Mode=TwoWay}"
MaxLength="100" />
<!-- リアルタイム検索フィルター -->
<TextBox Text="{Binding SearchText, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}"
PlaceholderText="検索..." />
<!-- 複数行テキストボックス -->
<TextBox AcceptsReturn="True"
TextWrapping="Wrap"
VerticalScrollBarVisibility="Auto"
MinHeight="100"
Text="{Binding Notes, Mode=TwoWay}"
VerticalAlignment="Stretch" />
<!-- 読み取り専用でコピー可能 -->
<TextBox IsReadOnly="True"
Text="{Binding GeneratedCode}"
FontFamily="Consolas" FontSize="12" />主な使用例
- フォームの入力フィールド — 名前・メール・住所など、基本的なテキスト入力フォームに使用します。
- 検索バー — UpdateSourceTrigger=PropertyChanged を使ってリアルタイムで検索結果をフィルタリングします。
- メモ・コメント欄 — AcceptsReturn=True の複数行モードで自由記述フィールドを実装します。
- コード・ログビューアー — IsReadOnly=True と固定幅フォント(Consolas など)で、コードスニペットやログをコピー可能な形式で表示します。
- 入力バリデーション — Text バインドに ValidationRule や INotifyDataErrorInfo を組み合わせてリアルタイム検証とエラー表示を実装します。
ヒントとベストプラクティス
- UpdateSourceTrigger は用途に合わせる — リアルタイム検索や入力バリデーションには
PropertyChangedを、フォームの送信前に一括検証する場合はデフォルトのLostFocusを使います。PropertyChangedは IME 変換中の未確定文字列も ViewModel に送るため、日本語入力を想定した場合は null/空チェックを忘れずに実装してください。 - StringFormat でバインド時のフォーマット指定 — 数値を TextBox に表示する場合、
StringFormat='{}{0:F2}'でフォーマットを指定できます。ただし編集中は書式なしの値が表示されるため、数値専用入力にはValidationRuleか専用の数値入力コントロールを検討してください。 - Validation.ErrorTemplate をカスタマイズ — バリデーションエラー時のデフォルト赤枠の代わりにカスタムエラー表示にする場合は
Validation.ErrorTemplateを設定します。エラーメッセージを表示するにはValidation.HasErrorとValidation.Errors[0].ErrorContentを使ったトリガーを定義します。 - 複数行モードには AcceptsReturn + TextWrapping + VerticalScrollBarVisibility — 複数行 TextBox には
AcceptsReturn=True、TextWrapping=Wrap、VerticalScrollBarVisibility=Autoの三点セットを設定します。どれか1つでも欠けると使い勝手が悪くなります。 - SelectAll() でフォーカス時に全選択 —
GotFocusイベントでSelectAll()を呼ぶと、フォーカスした瞬間に既存テキストが全選択されて簡単に上書き入力できます。添付ビヘイビアとして実装すると XAML から再利用できます。 - IsReadOnly の視覚的フィードバック —
IsReadOnly=Trueにする場合、デフォルトでは見た目が通常の TextBox と変わりません。StyleのトリガーでBackgroundやBorderBrushを変えて、ユーザーが編集不可と認識できるようにしてください。
関連コントロール
- TextBlock — 読み取り専用(選択・コピー不可)のテキスト表示。
- PasswordBox — パスワード(マスク表示)のテキスト入力。
- ComboBox — IsEditable=True で TextBox 機能を持つドロップダウン。
ソースコード
このデモ画面のソースコードは GitHub で公開しています。