6

我创建了一个 WinForms 用户控件。我阅读了一些关于事件的地方GotFocus()LostFocus()但我的用户控件没有在“属性”窗口的“事件”部分提供这些事件。

我什至尝试输入override以查看这些事件处理程序是否会出现,但它们不会。我在任何地方都找不到它们。

因此,我使用这些名称创建了自己的方法,然后出现以下错误:

警告 1 'mynamespace.mycontrol.GotFocus()' 隐藏了继承的成员 'System.Windows.Forms.Control.GotFocus'。如果打算隐藏,请使用 new 关键字。

这到底是怎么回事。如果GotFocus()已经存在,为什么我找不到并使用它?

4

4 回答 4

11

MSDN 文档看来,它们是从 Control 继承的,但不鼓励使用。他们希望您使用 Enter 和 Leave 事件。

注意 GotFocus 和 LostFocus 事件是绑定到 WM_KILLFOCUS 和 WM_SETFOCUS Windows 消息的低级焦点事件。通常,GotFocus 和 LostFocus 事件仅在更新 UICues 或编写自定义控件时使用。相反,Enter 和 Leave 事件应用于除 Form 类之外的所有控件,Form 类使用 Activated 和 Deactivate 事件。

也就是说,您可以按照 User1718294 建议的 += 访问它们,或者您可以覆盖OnGotFocusandOnLostFocus事件。

protected override void OnLostFocus(EventArgs e)
{
    base.OnLostFocus(e);
}

protected override void OnGotFocus(EventArgs e)
{
    base.OnGotFocus(e);
}
于 2012-11-13T04:04:08.763 回答
4

GotFocus 是一个已经存在的事件。您要做的是创建一个名为“GotFocus”的方法,因为已经存在同名的事件,所以您无法使用该名称创建方法。

为了“使用”一个事件,您必须向它注册一个函数,如下所示:

mycontrol.GotFocus += mycontrol_GotFocus;

现在只需添加此方法来处理事件:

private void mycontrol_GotFocus(object sender, EventArgs e)
{
   MessageBox.Show("Got focus.");
}
于 2012-11-13T03:26:21.533 回答
0

当您从一个类继承并且您不确定它包含哪些方法/属性时,您可以简单地查看基础对象

输入“基地”。在方法主体内,自动完成将向您显示基本方法。

于 2012-11-13T04:10:29.780 回答
0

使用 Visual Studio 2010

获得焦点时使用Activated事件,失去焦点时使用Deactivate事件。这是以下示例代码,它在获得焦点时更改表单名称。(文件名是 Form1 类的字符串成员,它扩展了 Form 类)

private void Form1_Activated(object sender, EventArgs e)
    {
        if (fileName == "Untitled")
            this.Text = fileName + "- Text Editor";
        else this.Text = fileName + "- Text Editor";
    }
于 2016-12-27T08:05:41.900 回答