【C#】日本語入力時のTextBox.TextChangedイベントについて

Keyboard Office Cup Table Work  - ZD_New_Media / Pixabay
ZD_New_Media / Pixabay

備忘録的にVaNTの開発で得られたコーディング上のノウハウなども書いていきたいと思います。


VaNTはC#で書かれたWindows Form Applicationです。VaNTのメイン画面上部にあるテキストボックスは、文字が入力されると動的にメモを検索し、メモリストを絞り込むようになっていますが、このテキストボックスのTextChangedイベントが曲者です。

 IMEオフの時は問題ないのですが、IMEオン状態のときは日本語を入力して変換を確定させると、確定した言葉の1文字ずつに対して全てTextChangedイベントが発火してしまいます。
例えば、「かいはつめも」と入力後スペースキーで「開発メモ」と変換してエンターキーで確定したとすると、「開」「発」「メ」「モ」のそれぞれでTextChangedイベントの処理が実行されるため、確定した文字列が一文字ずつ遅れながら入力されるという動作になり、ユーザーとしては非常にストレスが溜まります。

RichTextBoxのTextChangedイベントの場合は、確定した単位で発火するらしいですが、フォントやカラーの無効化が面倒そうだったので、何とかTextBoxでうまくやる方法を模索しました。

VaNTでは前述のテキストボックスのTextChangedイベントのコードは次ようにしています。


if (me.Text.Trim() == "")
{
	ShowAllMemo();
}
else
{
	Task searchtask = Task.Run(() =>
	{
		SearchMemo(me.Text.Trim());
	});
}

ポイントはelse文のところで、メモのフィルタ処理を実行するSearchMemo関数を非同期で実行しています。

このようにすることで、TextChangedイベント発火時にメインスレッドの待ちがなくなるため、日本語入力の確定した文字も瞬時に入力されるようになります。
たったこれだけのことですが、体感速度は劇的に向上するので面白いですね。

コメント

タイトルとURLをコピーしました