ありがとう、私はいくつかの背景を与えます。
私のコントロールは、グリッドとツールバーを含む UserControl です。ユーザーは通常、これらのコントロールのいくつかを起動して、システムのデータのさまざまなスライスを表示します。
現在のグリッドで選択した行からアクションを起動できるキーボード ショートカットがいくつかあります。ただし、これらのキーボード ショートカットは、現在フォーカスされているグリッドだけに適用する必要はありません。ユーザーが現在、アプリケーションの他の多くの領域の 1 つにフォーカスしている場合でも、このキーボード ショートカットは機能し、最後にフォーカスされたグリッドにルーティングされる必要があります。
そこで、UserControl の Control.Enter イベントに関数を配線して、基本的に LastFocusedGrid = this と言います。
そして、ドッキングとドッキング解除を除いて、それは機能します...
これらのコントロールは、ドッキング機能を備えたアプリケーション内でホストされており、Visual Studio に多少似ています。
既定では、Visual Studio でソース ファイルを開く方法と同様に、コントロールはアプリケーションのメイン作業領域内のタブとして起動します。
ただし、ユーザーは、タブ ヘッダーをつかんでメイン アプリケーションからドラッグすることで、タブを「切り取る」ことができます。この時点で、アプリケーションはコントロールをホストする新しい「フロート フォーム」を作成します。メイン アプリケーションとこのフロート フォームとの間の切り替えは、Control.Enter および Form.Activated イベントの目的で、アプリ間の切り替えと同じです。
その時点で、元の投稿で説明されているサンプル アプリケーションでシミュレートされた「フォーム内の 1 つのコントロール」シナリオがあります。
さて、これを回避する方法がいくつかあります。フォームを切り替えるときに発生する Form.Activated イベントを利用できます。テスト アプリケーションのイベントを Form の Activated イベントに追加すると、うまく機能することがわかります。
問題は、私の UserControl とその親 Form との関係が流動的であるため、ソリューションがやや複雑になることです。「this.ParentForm.Activated」に配線してみましたが、問題なく動作しました。問題は、これをいつ呼び出すかです。ドッキング解除/再ドッキングするとどうなりますか? 「previousParentForm」のようなものを含む厄介なコードの束になってしまい、古いフォームからフックを外すことができましたが、親フォームが変更されているときにドッキングシステムが通知しないという問題にまだ直面していました。そのため、そこでも多くの変更を加える必要がありました。
これらの問題は解決できないわけではありませんが、より単純なコントロール レベルの「親フォームがアクティブ化されました」というイベントがあれば、より洗練されたものになります。
かなり長いですが、状況が明確になることを願っています。