我有一个 Windows 窗体自定义控件,其作用类似于面板,因为它可以包含任意数量的子项。子控件的数量和类型是在运行时确定的,因此我需要以通用方式工作,而不知道可能存在或不存在的确切子控件。
我想根据面板是否包含焦点来更改面板的背景颜色。因此,如果面板的子级(或面板子级的子级等...)获得焦点,我想知道这一点,以便我可以更新自定义面板的背景颜色。当焦点转移到子层次结构中不存在的内容时,我还需要知道,以便我可以恢复到原始背景颜色。
Control.ContainsFocus 非常适合告诉我面板是否包含子层次结构中的焦点,但我需要知道何时发生更改。目前我只能想出以下糟糕的机制。
我挂钩每个孩子的 GotFocus/LostFocus 以及每个孩子的每个孩子等。我还必须挂钩 ControlAdded/ControlRemoved 以确保我与可能变化的孩子层次结构保持同步。正如您所看到的,这可能最终会产生大量事件挂钩,我怀疑必须有一种更简单的方法。有任何想法吗?
似乎使用Enter and Leave事件就是答案。 GotFocus 只会发送到获得焦点的特定控件,而 Enter 事件也会发送到获取 GotFocus 事件的控件的父(和祖先)控件。
from http://msdn.microsoft.com/en-us/library/system.windows.forms.control.leave.aspx http://msdn.microsoft.com/en-us/library/system.windows.forms.control.leave.aspx
“进入和离开事件是分层的,并且会级联并
沿着父链向下移动,直到达到适当的控制。为了
例如,假设您有一个带有两个 GroupBox 控件的 Form,并且每个控件
GroupBox 控件有一个 TextBox 控件。当插入符号从
将一个文本框转移到另一个文本框,为文本框引发离开事件
和 GroupBox,并且为其他 GroupBox 引发 Enter 事件
文本框。”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)