WPF 標準コントロールデモアプリ › TextBox

TextBox Inputs

TextBox はユーザーがテキストを入力・編集できる最も基本的な入力コントロールです。単一行・複数行モード、テキストの折り返し、読み取り専用モード、テキスト選択のカスタマイズをサポートします。

概要

WPF の TextBoxTextBoxBase を継承したテキスト入力コントロールです。Text プロパティを ViewModel の string プロパティに TwoWay バインドするのが標準的な MVVM パターンです。

AcceptsReturn="True" にすると Enter キーで改行できる複数行テキストボックスになります。TextWrapping="Wrap" と組み合わせると、コンテンツが幅を超えた場合に自動で折り返します。垂直スクロールバーは VerticalScrollBarVisibility="Auto" で追加できます。

リアルタイム入力検証や検索フィルタリングなど、入力のたびに処理が必要な場合は UpdateSourceTrigger="PropertyChanged" を使います。これにより、フォーカスを失ったときではなく文字を入力するたびにバインドソースが更新されます。

IsReadOnly="True" にするとユーザーがテキストを編集できなくなりますが、テキストの選択・コピーは可能な点が TextBlock との大きな違いです。読み取り専用でも選択してコピーできる TextBox は、エラーメッセージや技術情報の表示に便利です。

画面キャプチャ

textbox demo screen

デモしているプロパティ

以下のプロパティが WPF 標準コントロールデモアプリでインタラクティブにデモされています。

プロパティ設定値説明
Textstringテキストボックスに表示・編集するテキストを設定します。ViewModel の string プロパティに Mode=TwoWay でバインドするのが標準的な MVVM パターンです。フォーカスを失った瞬間にバインドソースが更新されますが、リアルタイム検証や検索フィルターには UpdateSourceTrigger=PropertyChanged を追加して文字入力ごとに更新させます。はまりポイント: UpdateSourceTrigger=PropertyChanged を指定すると IME(日本語入力)の変換中でも更新が走るため、確定前の未完成な文字列が ViewModel に届く場合があることを考慮してください。
AcceptsReturnbool複数行テキストボックスを実現したい場合に True を設定します。True のとき Enter キーで改行が挿入され、複数行入力が可能になります。デフォルト(False)の単一行モードでは Enter キーはウィンドウの IsDefault="True" なボタン(送信ボタンなど)をアクティブにします。はまりポイント: AcceptsReturn=True にしても縦方向に伸びるだけで縦スクロールバーは出ません。必ず VerticalScrollBarVisibility="Auto"TextWrapping="Wrap" を一緒に設定してください。
TextWrappingNoWrap / Wrap / WrapWithOverflowテキストの折り返し方法を設定します。Wrap は単語の境界で折り返し、WrapWithOverflow は単語が幅を超える場合でも単語の途中で折り返します(URL など長い単語を含む場合は WrapWithOverflow が適切です)。NoWrap(デフォルト)では横スクロールが発生するため、横スクロールバーを HorizontalScrollBarVisibility="Auto" と組み合わせるか、横スクロール不要なら Wrap を使います。はまりポイント: NoWrapTextTrimming は TextBox では効果がありません(TextTrimming は TextBlock 用です)。
IsReadOnlyboolユーザーにテキストの編集は許可せず、閲覧・コピーだけを許可したい場合に True に設定します。編集操作はブロックされますが、テキストの選択・コピーは引き続き可能です。これは TextBlock(選択・コピー不可)との大きな違いで、エラーメッセージや生成コードの表示に最適です。はまりポイント: デフォルトでは読み取り専用の視覚的なインジケーター(背景色変化など)がありません。ユーザーが気づけるよう、StyleIsReadOnly=True のトリガーを定義して背景色を変えることを検討してください。
MaxLengthintフォームバリデーションや DB の文字数制約に合わせた入力制限が必要な場合に設定します。設定した文字数に達すると、それ以降の入力が無音でブロックされます(エラー表示はされません)。0(デフォルト)は無制限です。はまりポイント: MaxLength は UI レベルのみの制限です。ユーザーがコードビハインドやビヘイビア経由でテキストを設定した場合には制限されないため、必ず ViewModel 側でもバリデーションを実装してください。
CaretBrushBrushカスタムテーマや高コントラストモードで、テキストカーソル(キャレット)がテーマカラーと同化して見えにくくなる場合に設定します。指定した Brush の色でキャレットが描画されるようになります。はまりポイント: CaretBrush は Windows 10 以降の WPF スタイル(aero2 テーマ)でのみ有効です。古い Windows テーマでは無視されることがあります。
SelectionBrush / SelectionOpacityBrush / 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 / HorizontalScrollBarVisibilityDisabled / 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" />

主な使用例

ヒントとベストプラクティス

関連コントロール

ソースコード

このデモ画面のソースコードは GitHub で公開しています。

GitHub で TextBox のソースコードを見る →