10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PreviewTextInputのポイント

Last updated at Posted at 2017-02-21

ぶっちゃけ, WPF (というかUWP) で text box の入力検証は「入力完了時」に ValidationRules 使ってエラー表示してやるのが筋だと思うんだが。
MFC や Windows.Form に慣れた人々 (だいたいは社内) は「数値以外入力できないようにして!」とぶーぶー言う。
じゃあ WPF で「入力できないようにする」方法はとgoogle検索すると出てくる解決策が text box の PreviewTextInput で e.Handled = true する方法。

ざっと数サイト見た感じ, このサンプルコードがバグっているので, どういうロジックを実装すべきかを備忘的に書いておく。

  1. 入力された文字 (e.Text) をチェックする。←これはどこでも書いてある
  2. 既存の文字と組み合わせてチェックする。←ここが無かったりバグってたり。
    1. TextBox.Text + e.Text は ダメ絶対
    2. TextBox で選択されている文字列 (TextBox.SelectedText) があれば, これを消して, そこに e.Text を入れた文字列を作る (string.Replace(TextBox.SelectedText, e.Text) でいけそう)
    3. TextBox で文字が選択されていなければ, 現在のキャレット位置に e.Text を挿入した文字列を作る (string.Insert(TextBox.CaretIndex, e.Text) でいける)

作った文字列の検証は double.TryParse 等お好きなので良い。

さらに注意が必要なのがマイナス値や小数点を許容する場合,
↑の既存文字と組み合わせて作った文字列 が "-" だけだったり "." だけだったりしたら許容する
のを忘れないこと。

あと ".123" を "0.123" にする処理や, ".123" を "0.12" に丸める処理やらは PreviewTextInput じゃなくて Binding先でやろう。".123" の 真ん中の "2" を消したいユーザもいるんだから。

クリップボードからのペースト (PreviewTextInput は呼ばれない) の処理もお忘れ無く。

10
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?