ぶっちゃけ, WPF (というかUWP) で text box の入力検証は「入力完了時」に ValidationRules 使ってエラー表示してやるのが筋だと思うんだが。
MFC や Windows.Form に慣れた人々 (だいたいは社内) は「数値以外入力できないようにして!」とぶーぶー言う。
じゃあ WPF で「入力できないようにする」方法はとgoogle検索すると出てくる解決策が text box の PreviewTextInput で e.Handled = true する方法。
ざっと数サイト見た感じ, このサンプルコードがバグっているので, どういうロジックを実装すべきかを備忘的に書いておく。
- 入力された文字 (
e.Text
) をチェックする。←これはどこでも書いてある - 既存の文字と組み合わせてチェックする。←ここが無かったりバグってたり。
-
TextBox.Text + e.Text
は ダメ絶対 - TextBox で選択されている文字列 (
TextBox.SelectedText
) があれば, これを消して, そこにe.Text
を入れた文字列を作る (string.Replace(TextBox.SelectedText, e.Text)
でいけそう) - TextBox で文字が選択されていなければ, 現在のキャレット位置に
e.Text
を挿入した文字列を作る (string.Insert(TextBox.CaretIndex, e.Text)
でいける)
-
作った文字列の検証は double.TryParse
等お好きなので良い。
さらに注意が必要なのがマイナス値や小数点を許容する場合,
↑の既存文字と組み合わせて作った文字列 が "-" だけだったり "." だけだったりしたら許容する
のを忘れないこと。
あと ".123" を "0.123" にする処理や, ".123" を "0.12" に丸める処理やらは PreviewTextInput じゃなくて Binding先でやろう。".123" の 真ん中の "2" を消したいユーザもいるんだから。
クリップボードからのペースト (PreviewTextInput は呼ばれない) の処理もお忘れ無く。