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回で反応
という普通の挙動が得られるようになりました。