【发布时间】:2010-03-03 13:16:55
【问题描述】:
我有一个 C# .NET 中的 Windows 窗体应用程序。它包含一个用户绘制的控件,该控件还处理键盘焦点。如果控件的一部分具有焦点,则会在其周围绘制焦点高亮边框。当包含控件的窗体被停用时,焦点边框显然必须从控件中消失。但是控件甚至没有收到有关它的通知。它只在另一个控件获得焦点时接收“离开”事件,而不是另一个窗口。控件怎么会知道呢?
【问题讨论】:
我有一个 C# .NET 中的 Windows 窗体应用程序。它包含一个用户绘制的控件,该控件还处理键盘焦点。如果控件的一部分具有焦点,则会在其周围绘制焦点高亮边框。当包含控件的窗体被停用时,焦点边框显然必须从控件中消失。但是控件甚至没有收到有关它的通知。它只在另一个控件获得焦点时接收“离开”事件,而不是另一个窗口。控件怎么会知道呢?
【问题讨论】:
当Form+Control加载完毕后,Control可以订阅Form的Activate和DeActivated事件。
如果它是一个用户控件,您可以使用 Control.Load 事件来执行此操作。对于 CustomControl,我必须查找它。
无论如何,请务必在您的控件中实现 Dispose 以取消订阅事件。
试了一下:
private void UserControl1_FormActivate(object sender, EventArgs e)
{
label1.Text = "Acitve";
}
private void UserControl1_FormDeActivate(object sender, EventArgs e)
{
label1.Text = "InAcitve";
}
private void UserControl1_Load(object sender, EventArgs e)
{
this.ParentForm.Activated += UserControl1_FormActivate;
this.ParentForm.Deactivate += UserControl1_FormDeActivate;
}
【讨论】:
UserControl(因此既不存在Load事件也不存在ParentForm属性),那么你可以在控件的GotFocus 事件中将事件处理程序添加到this.FindForm,假设在没有获得焦点之前值不会改变。至少在我的情况下,只要控件失去足够的焦点,我就想检测/验证更改。 (不幸的是,LostFocus、Leave、Validating 如果表单已停用,请不要触发。)