谢谢,我会提供一些背景。
我的控件是一个包含网格和工具栏的 UserControl。用户通常会启动其中几个控件来查看系统数据的不同部分。
有几个键盘快捷键可以从当前网格中的选定行启动操作。但是,要求这些键盘快捷键不仅适用于当前聚焦的网格。如果用户当前专注于应用程序的许多其他区域之一,那么这个键盘快捷键应该仍然有效,它应该被路由到最后一个焦点网格。
所以我将一个函数连接到我的 UserControl 的 Control.Enter 事件,基本上说 LastFocusedGrid = this。
它会工作,除了对接和脱离...
看,这些控件托管在具有停靠功能的应用程序中,有点类似于 Visual Studio。
默认情况下,控件作为应用程序主工作区域中的选项卡启动,类似于在 Visual Studio 中打开源文件的方式。
但是,用户可以通过抓住选项卡标题并将其拖出主应用程序来“撕掉”选项卡。此时,应用程序创建一个新的“浮动表单”来承载控件。就 Control.Enter 和 Form.Activated 事件而言,在主应用程序和此浮动表单之间切换与在应用程序之间切换相同。
那时,我们使用原始帖子中描述的示例应用程序模拟了“表单中的一个控件”场景。
现在,有一些方法可以解决这个问题。我可以利用 Form.Activated 事件,该事件在表单之间切换时会触发。如果您在测试应用程序中将一个事件添加到 Form 的 Activated 事件中,您会发现它工作得很好。
问题是我的 UserControl 与其父窗体的关系是流动的,使得解决方案有些复杂。我尝试连接到“this.ParentForm.Activated”,它工作正常。问题是你什么时候调用这个?当您取消停靠/重新停靠时会发生什么?我最终得到了一堆令人讨厌的代码,其中包含“previousParentForm”之类的东西,这样我就可以从旧表单中解脱出来,然后我仍然面临着当我的父表单被更改时对接系统没有通知我的问题,所以我也必须在那里做一些改变。
这些问题并非无法解决,但如果有一个更简单的控制级“父窗体被激活”事件,那就优雅多了。
这相当长,但我希望它能澄清情况。