if(e.Key==Key.Enter)
{
//なんか処理
}
とかよくしていたんですが、WPFになってから、IMEでの変換確定のEnterでも反応してしまうのでモヤモヤしていました。
なんとか解決できたっぽいので記録。
using System.Windows.Input;
///中略
private bool isImeOnConv = false; //IME利用中かどうか判定するフラグ
private int EnterKeyBuffer { get; set; } //IMEでの変換決定のEnterキーに反応させないためのバッファ
public HogeHogeConstructor()
{
TextCompositionManager.AddPreviewTextInputHandler(tbNewDiag, OnPreviewTextInput);
TextCompositionManager.AddPreviewTextInputUpdateHandler(tbNewDiag, OnPreviewTextInputUpdate);
}
private void OnPreviewTextInput(object sender, TextCompositionEventArgs e)
{
if (isImeOnConv)
{
EnterKeyBuffer = 1;
}
else
{
EnterKeyBuffer = 0;
}
isImeOnConv = false;
}
private void OnPreviewTextInputUpdate(object sender, TextCompositionEventArgs e)
{
if (e.TextComposition.CompositionText.Length == 0)
{
isImeOnConv = false;
}
else
{
isImeOnConv = true;
}
}
private void textBox_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
if (isImeOnConv == false && e.Key == Key.Enter && EnterKeyBuffer == 1)
{
EnterKeyBuffer = 0;
}
else if (isImeOnConv == false && e.Key == Key.Enter && EnterKeyBuffer == 0)
{
foo();
}
}
これで
・IMEをoffにして入力した場合はEnter1回で反応
・IMEをonにして入力した場合は変換確定のEnterでは反応せず、次のEnterで反応
・IMEをonにして入力を開始し、バックスペースで文字を消去してIMEをoffにして入力した場合もEnter1回で反応
という普通の挙動が得られるようになりました。