RunningCSharp

MS系開発者による、雑多な記事。記事は所属企業とは関係のない、個人の見解です。

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のコントロールにはもっと簡単な制御機能がついていたり…しますかね…