C# Windows窗体控件如何知道其窗体何时被(取消)激活?

C# Windows窗体控件如何知道其窗体何时被(取消)激活?,c#,forms,controls,focus,C#,Forms,Controls,Focus,我在C#NET中有一个Windows窗体应用程序。它包含一个用户绘制的控件,该控件还处理键盘焦点。如果控件的某个部分具有焦点,则会在其周围绘制一个焦点高光边框。当包含控件的窗体被停用时,焦点边框显然必须从控件中消失。但是控件甚至没有收到关于它的通知。它仅在另一个控件聚焦时接收“离开”事件,而不是另一个窗口。控件如何知道这一点?加载表单+控件时,控件可以订阅表单的激活和停用事件 如果它是UserControl,则可以使用Control.Load事件来执行此操作。对于CustomControl,我必

我在C#NET中有一个Windows窗体应用程序。它包含一个用户绘制的控件,该控件还处理键盘焦点。如果控件的某个部分具有焦点,则会在其周围绘制一个焦点高光边框。当包含控件的窗体被停用时,焦点边框显然必须从控件中消失。但是控件甚至没有收到关于它的通知。它仅在另一个控件聚焦时接收“离开”事件,而不是另一个窗口。控件如何知道这一点?

加载表单+控件时,控件可以订阅表单的激活和停用事件

如果它是UserControl,则可以使用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;
}

谢谢我希望有一种更直观的方法。我在OnLoad方法中添加了两个事件处理程序。现在,在我控制的另一部分,我得到了一个奇怪的OutOfMemory异常;在Dispose方法中ParentForm为null,因此我无法再注销事件!有什么想法吗?好吧,把这个标记为答案。它起作用了,我设法解决了另一个错误。我假设不需要取消订阅事件,因为Dispose方法中的ParentForm无论如何都为null。如果有人不同意,请回答我。@Lonely,除非您经常在运行时添加/删除此控件,否则这并不重要。这是一个老问题,但可能会帮助其他人:如果自定义控件不继承
UserControl
(因此既不存在
Load
事件,也不存在
ParentForm
属性),然后,您可以将事件处理程序添加到控件的
GotFocus
事件中的
this.FindForm
,前提是该值在未获得焦点之前不会更改。至少在我的例子中,我希望在控件失去焦点时检测/验证更改,这是足够的。(不幸的是,
LostFocus
离开
验证
如果表单被停用,则不会触发。)