Q028.WPF の TextBox.TextChanged イベントって IME の変換候補を選択しただけでも発生しますが、これって仕様でしょうか?
A. WPF の TextBox.TextChanged イベントは WindosForms とは全く挙動が違います。WPF の TextBox は Text Service Framework(TSF) に対応しているため、変換候補を選択しただけでも TextChanged イベントが発生するのは仕様みたいですね。でもこれを知らないと場合によっては重大なバグを引き起こすので、何とかして欲しいものです。
回避策ですが、TextChanged イベントを使わず、TextCompositionManager.AddPreviewTextInputHandler メソッドを使い、TextBox に添付イベントハンドラを追加します。以下は TextBox にひらがなと漢字の入力制限を設けたサンプルです。yone64 さんには感謝!!
using System.Text.RegularExpressions; using System.Windows; using System.Windows.Controls; using System.Windows.Input; namespace WpfApplication1 { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); TextCompositionManager.AddPreviewTextInputHandler(textBox1, OnPreviewTextInput); } private void OnPreviewTextInput(object sender, TextCompositionEventArgs e) { var reg = new Regex(@"\p{IsHiragana}|\p{IsCJKUnifiedIdeographs}"); var str = reg.Replace(textBox1.Text, ((Match m) => string.Empty)); textBox1.Text = str; } } }
関連記事 : IMEで変換状態中でもTextBox.TextChangedが発生する
関連記事 : フィードバック:WPF の TextBox.TextChanged イベント内で文字列を削除し IME の変換候補を表示すると重大エラーが発生する