【WPF】TextBoxの入力制限【C#】

何度か挫折してきたVisual StudioでのWindowsアプリ作成を勉強中です。とりあえずやってみるということで、書籍を買ってみました。

買う前に気付くべきだったのですが、この本、Windowsフォームアプリについて書いています。WPFで学びたい・・・とおもいつつサンプルプログラムをなぞっています。

税金計算サンプル

Chapter3の税金計算アプリです。サンプルアプリなので当然といえば当然ですが、実用的かというと微妙です。

とりあえず、テキストボックスに入力制限をかけたいです。

MainWindow.xamldeで、

<TextBox
InputMethod.IsInputMethodEnabled=”False”
PreviewTextInput=”textBoxPrice_PreviewTextInput”
CommandManager.PreviewExecuted=”textBoxPrice_PreviewExecuted”/>

とありますが、ここで個人的に重要なのは、

InputMethod.IsInputMethodEnabled=”False”

の指定ですね。なぜGUIの「プロパティ」から設定できないのだろう・・・InputMethod.IsInputMethodEnabledの設定で、テキストボックスでIMEが動作しなくなります。

次の行の

PreviewTextInput=”textBoxPrice_PreviewTextInput”

はイベントハンドラから作るように設定しました。ここで、PreviewTextInputですが、ほかにもTextUpdated、TextChanged、TextInputなどいろいろあります。

TextUpdatedは実際の表示が変わる前にチェックできる機能のようなので、PreviewTextInputと同じように見えますが・・・。

private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
// 0-9と小数点
e.Handled = !new System.Text.RegularExpressions.Regex(“[0-9.]”).IsMatch(e.Text);
}

で作ってみますが、挙動的に最後に入力した一文字のみで判定されるのですね。この文法だと、マッチしたらfalseが返り、マッチしない場合(数字と小数点でない場合)trueとなり入力イベントがキャンセルされます。

これだけだと全体の状態がわからないので、TextChangedイベントを作りました。

private String textBoxContent = “0”;

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
TextBox srcBox = e.Source as TextBox;
if (new System.Text.RegularExpressions.Regex(“^(0?|[1-9][0-9]*)\\.?[0-9]*$”).IsMatch(srcBox.Text))
textBoxContent = srcBox.Text;
else
srcBox.Text = textBoxContent;
}

前の状態を保持していないと、どうしてよいのかわからないので、関数外に変数を作りました。どういうのが良いのかはわかりませんが、とりあえず小数点のピリオドは一つまで、また、最初にゼロが来たらほかの数字は不許可(00.123、010.010とかは不許可)にしておきます。文字を削除するときに結構面倒ですが、苦手な正規表現の練習に・・・。ただ、どうせなら、PreviewTextInputでキャンセルしつつ、エラーをツールチップに表示させたいですね。ただ、PreviewTextInputだとコピペが検出不能ですよね。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする