更新:議論の結果、wpf アプリケーション内でホストされているカスタム コントロール テキスト ボックスが、winforms アプリケーション内の elementhost を介して再度ホストされている場合にのみ、問題が発生することが明らかになりました。
TextBox から継承した WPF-CustomControl があります。OnLostKeyBoardFocus メソッドをオーバーライドします。
このメソッドの一部として、イベントを発生させます。1 つのイベント ハンドラーが MessageBox を表示しています (これは私の制御下にありません)。ユーザーが MessageBox を閉じると、KeyBoardFocus が TextBox に直接返されます。ただし、OnLostKeyboardFocus(...) はまだ返されていません。
TextBox コントロールへの自動 (再) フォーカスは、さまざまな問題を引き起こします。Dispatcher.BeginInvoke() を使用してイベントをディスパッチする以外の方法で、この動作を回避できますか。
class MyTextBoxCustomControl : TextBox {
public event EventHandler<EditCompletedEventArgs> EditCompleted;
private void OnEditCompleted(EditCompletedEventArgs e)
{
var handler = EditCompleted;
if (handler != null) handler(this, e);
}
protected override OnLostKeyboardFocus(KeyboardFocusChangedEventArgs e){
base.OnLostKeyboardFocus(e);
OnEditCompleted(new EditCompletedEventArgs())
//Before this point is reached OnGotKeyboardFocus(...) is called
}
protected override void OnGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
{
base.OnGotKeyboardFocus(e);
//Is called twice, directly after MessageBox is closed and
//after OnLostKeyboardFocus(...) returns
}
}
class MyEventHandler {
private void Test(){
var myTBCC = new MyTextBoxCustomControl();
//Closing the message box will return focus to myTBCC, which directly
//causes OnGotKeyboardFocus to be called
myTBCC.EditCompleted += (a, b) =>
MessageBox.Show("PressOk");
}
}