TOC

This article is currently in the process of being translated into Japanese (~90% done).

Basic controls:

The TextBox control

TextBoxコントロールはWPFの中で一番簡単なテキスト入力コントロールです。ダイアログでの単一行や、エディタのような複数行のプレーンテキストをユーザーに入力させます。

単一行のTextBox

TextBoxコントロールはとても一般的に使われており、本格的な編集機能のために実質的に何のプロパティも使う必要がない。必要最小限の例を示します。

<Window x:Class="WpfTutorialSamples.Basic_controls.TextBoxSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="TextBoxSample" Height="80" Width="250">
    <StackPanel Margin="10">
		<TextBox />
	</StackPanel>
</Window>

テキスト編集のためにはこれで十分です。ここではサンプルを走らせてテキストを入力した後にスクリーンショットを撮影しましたが、マークアップのTextプロパティを使ってデフォルト文字列を入力しておくことで同様のことが出来ます。

<TextBox Text="Hello, world!" />

TextBoxで右クリックしてみて下さい。オプションメニューが現れてWindowsのクリップボードが使えます。アンドゥやリドゥ(Ctrl+Z and Ctrl+Y)のキーボードショートカットも動作します。この機能性の全てはあなたを開放します。

複数行のTextBox

上の例を実行すると、TextBoxコントロールはデフォルトで単一行コントロールであることがわかるでしょう。エンターキーを押しても何も起こりません。1行に収まらないテキストを書き加えてもスクロールするだけです。しかし、TextBoxコントロールを複数行のエディターにするのは大変簡単です。

<Window x:Class="WpfTutorialSamples.Basic_controls.TextBoxSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="TextBoxSample" Height="160" Width="280">
    <Grid Margin="10">
		<TextBox AcceptsReturn="True" TextWrapping="Wrap" />
	</Grid>
</Window>

二つのプロパティを加えました。 AcceptsReturnはEnter/Returnキーで次の行に移れるようにして、TextBoxコントロールを複数行対応にします。TextWrappingプロパティは行端に達したら自動的にテキストを折り返します。

TextBoxのスペルチェック

さらに、TextBoxコントロールには英語と他のいくつかの言語(執筆時点では英語、フランス語、ドイツ語、スペイン語がサポートされています)に対応したスペルチェックが付いています。

スペルチェックはMicrosoft Wordとよく似ています。スペル間違いのところにアンダーラインが引かれ、右クリックで修正候補が現れます。スペルチェックを有効にするのは大変簡単です。

<Window x:Class="WpfTutorialSamples.Basic_controls.TextBoxSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="TextBoxSample" Height="160" Width="280">
    <Grid Margin="10">
		<TextBox AcceptsReturn="True" TextWrapping="Wrap" SpellCheck.IsEnabled="True" Language="en-US" />
	</Grid>
</Window>

以前作った複数行TextBoxの例を元にして、二つの新しいプロパティを付け加えました。一つはSpellCheckクラスのIsEnabledで、単純に親コントロールのスペルチェックを有効にします。もう一つはLanguageプロパティでスペルチェックにどの言語を使うのか指示します。

TextBoxの選択の振る舞い

Windowsの他の編集機能を持ったコントロールと同じように、TextBoxは一度に文全部を消すためや、クリップボードにテキストをコピーするためのテキストの選択が出来ます。WPFのTextBoxは選択したテキストを読んだり変更したりさえ出来るいくつかのプロパティを持っています。次の例ではそれらのプロパティを読んでみます。

<Window x:Class="WpfTutorialSamples.Basic_controls.TextBoxSelectionSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="TextBoxSelectionSample" Height="150" Width="300">
	<DockPanel Margin="10">
		<TextBox SelectionChanged="TextBox_SelectionChanged" DockPanel.Dock="Top" />
		<TextBox Name="txtStatus" AcceptsReturn="True" TextWrapping="Wrap" IsReadOnly="True" />

	</DockPanel>
</Window>

この例では二つのTextBoxがあります。一つは編集用でもう一つは選択のステータスを表示します。このため、ステータス用のTextBoxはIsReadOnlyプロパティをtrueに設定して編集できなくしています。最初のTextBoxのSelectionChangedイベントをコードビハインドでサブスクライブしています。

using System;
using System.Text;
using System.Windows;
using System.Windows.Controls;

namespace WpfTutorialSamples.Basic_controls
{
	public partial class TextBoxSelectionSample : Window
	{
		public TextBoxSelectionSample()
		{
			InitializeComponent();
		}

		private void TextBox_SelectionChanged(object sender, RoutedEventArgs e)
		{
			TextBox textBox = sender as TextBox;
			txtStatus.Text = "Selection starts at character #" + textBox.SelectionStart + Environment.NewLine;
			txtStatus.Text += "Selection is " + textBox.SelectionLength + " character(s) long" + Environment.NewLine;
			txtStatus.Text += "Selected text: '" + textBox.SelectedText + "'";
		}
	}
}

この例を実行するために興味深い3つのプロパティを使っています。

SelectionStart:現在のカーソル位置か、選択されているならば開始位置。

SelectionLength:選択されていればその長さ。なければ0。

SelectedText:選択されていれば選択された文字列。なければ空文字列。

選択文字列の変更

これら全てのプロパティは読み書き可能です。これは選択のステータスを変更できることを意味します。例えば、SelectionStartとSelectionLengthプロパティを設定してテキストの選択範囲を変更したり、SelectedTextプロパティを使って文字列を挿入・選択出来ます。ただ、これらの操作をする前にFocus()メソッドを呼び出すなどして、TextBoxがフォーカスを持っていなければなりません。


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!