0

更新:議論の結果、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");                    
    }
}
4

1 に答える 1