Спасибо, я дам немного фона.
Мой элемент управления - это UserControl, который содержит сетку и панель инструментов. Пользователь обычно запускает несколько из этих элементов управления для просмотра различных фрагментов системных данных.
Существует несколько сочетаний клавиш, которые могут запускать действия из выбранной строки в текущей сетке. Однако требуется, чтобы эти сочетания клавиш применялись не только к текущей сетке . Если пользователь в настоящее время сосредоточен на одной из многих других областей приложения, то это сочетание клавиш все еще должно работать, и оно должно быть перенаправлено на последнюю выделенную сетку .
Поэтому я связал функцию с событием Control.Enter моего UserControl, чтобы в основном сказать LastFocusedGrid = this.
И это сработало бы, кроме стыковки и расстыковки ...
Видите, эти элементы управления размещены внутри приложения с функциями стыковки, чем-то похожими на Visual Studio.
По умолчанию элемент управления запускается как вкладка в основной рабочей области приложения, аналогично тому, как исходный файл открывается в Visual Studio.
Однако пользователь может «вырвать» вкладку, взяв заголовок вкладки и вытащив его из основного приложения. На этом этапе приложение создает новую «форму с плавающей точкой» для размещения элемента управления. Переключение между основным приложением и этой плавающей формой такое же, как переключение между приложениями для целей событий Control.Enter и Form.Activation.
В этот момент у нас есть сценарий «один элемент управления в форме», смоделированный с помощью примера приложения, описанного в исходном посте.
Теперь, есть несколько способов обойти это. Я мог бы использовать событие Form.Activation, которое срабатывает при переключении между формами. Если вы добавите событие в тестовом приложении в событие Активированная форма, вы увидите, что оно отлично работает.
Проблема в том, что отношения моего UserControl с его родительской формой изменчивы, что делает решение несколько сложным. Я попытался подключиться к «this.ParentForm.Activation», который работал хорошо. Проблема в том, когда ты это называешь? Что происходит, когда вы расстыкованы? В итоге я получил неприятный код с такими вещами, как «previousParentForm», так что я мог отсоединиться от старой формы, а затем я все еще сталкивался с проблемой, что система стыковки не уведомляет меня, когда моя родительская форма изменяется, так что мне тоже нужно было сделать кучу изменений.
Эти проблемы не являются неразрешимыми, но если существует более простое событие «родительская форма активирована», то это будет намного элегантнее.
Это довольно долго, но я надеюсь, что это прояснит ситуацию.