UWP:テキスト入力時、任意のテキストのみ削除する
TextChangedで作ると、IMEの文字入力最中でも文字が消されてしまったため、TextCompositionEndedイベントで実装しました。
private void TextBox_TextCompositionEnded(TextBox sender, TextCompositionEndedEventArgs args) { TextBox textBox = sender as TextBox; bool contains = false; //対象文字の確認 foreach (char c in "禁止文字") { contains |= textBox.Text.Contains(c); } if (!string.IsNullOrEmpty(textBox.Text) && contains) { //IME対策、キャレットインデックスを保存 int caretIndex = textBox.SelectionStart; //IME対策、置換前のテキスト長を保持(キャレットの復元に使用) int textlen = textBox.Text.Length; //対象文字の削除 foreach (char c in "禁止文字") { textBox.Text = textBox.Text.Replace(c.ToString(), string.Empty); } //IME対策、キャレットインデックスの復元 textBox.SelectionStart = caretIndex - (textlen - textBox.Text.Length); textBox.SelectionLength = 0; } }
ただ、禁止文字を削除すると、Ctrl+Z操作で戻れなくなります…この対処はまた別途考えます。 WPFではTextChangedイベントTextChangedEventArgs.UndoActionをチェックしていれば対処できたのですが…
あとWPFの時と同様にコード制御で書いちゃいましたが、UWPのコントロールにはもっと簡単な制御機能がついていたり…しますかね…