如何跟踪任何子控件何时获得或失去WinForms的焦点?

Phi*_*ght 2 .net focus winforms

我有一个Windows窗体自定义控件,它像一个面板,它可以包含任意数量的子窗口.子控件的数量和类型是在运行时确定的,因此我需要以通用方式工作,而不知道可能存在或可能不存在的确切子控件.

我想根据面板是否包含焦点来改变面板的背景颜色.因此,如果面板的孩子(或面板的孩子的孩子等......)获得焦点我想知道这一点,所以我可以更新自定义面板的背景颜色.当焦点转移到不在子层次结构中的某些东西时,我也需要知道所以我可以恢复到原始背景颜色.

Control.ContainsFocus非常适合告诉我面板是否包含子层次结构中的焦点,但我需要知道何时发生更改.目前我只能提出以下不良机制.

我挂钩每个孩子的GotFocus/LostFocus和每个孩子的每个孩子等.我还必须挂钩ControlAdded/ControlRemoved以确保我与可能的改变孩子hieararchy保持同步.正如你所看到的,这可能最终导致很多事件挂钩,我怀疑必须有一个更简单的方法.有任何想法吗?

ugl*_*ote 8

似乎使用EnterLeave事件就是答案.GotFocus将仅发送到获得焦点的特定控件,而Enter事件也将发送到获取GotFocus事件的控件的父(和祖先)控件.

来自http://msdn.microsoft.com/en-us/library/system.windows.forms.control.leave.aspx

"Enter和Leave事件是分层的,将在父链上下级联,直到达到适当的控制.例如,假设您有一个带有两个GroupBox控件的Form,并且每个GroupBox控件都有一个TextBox控件.当插入符号为从一个TextBox移动到另一个TextBox,为TextBox和GroupBox引发Leave事件,并为另一个GroupBox和TextBox引发Enter事件."