C# 当窗体被聚焦时发生的事件

C# 当窗体被聚焦时发生的事件,c#,.net,winforms,C#,.net,Winforms,我有两种形式,第一种是frmBase,第二种是frmBalloon。我改变了两种形式的焦点,第一种是显示frmBase,然后显示frmBalloon(frmBase不可见),然后再次显示frmBase。现在我需要先加载frmBase,然后在frmBalloon变得不可见后再显示事件 所以我需要的是当形式变得集中时发生的事件……你在追求什么 我之所以建议这样做而不是GotFocus,是因为如果焦点从一个窗体更改为另一个窗体上的控件,则窗体本身不会获得焦点。以下是一个示例应用程序: using Sy

我有两种形式,第一种是frmBase,第二种是frmBalloon。我改变了两种形式的焦点,第一种是显示frmBase,然后显示frmBalloon(frmBase不可见),然后再次显示frmBase。现在我需要先加载frmBase,然后在frmBalloon变得不可见后再显示事件

所以我需要的是当形式变得集中时发生的事件……

你在追求什么

我之所以建议这样做而不是
GotFocus
,是因为如果焦点从一个窗体更改为另一个窗体上的控件,则窗体本身不会获得焦点。以下是一个示例应用程序:

using System;
using System.Drawing;
using System.Windows.Forms;

class Test
{
    static void Main()
    {

        TextBox tb = new TextBox();
        Button button = new Button
        {
            Location = new Point(0, 30),
            Text = "New form"
        };
        button.Click += (sender, args) =>
        {
            string name = tb.Text;
            Form f = new Form();
            f.Controls.Add(new Label { Text = name });
            f.Activated += (s, a) => Console.WriteLine("Activated: " + name);
            f.GotFocus += (s, a) => Console.WriteLine("GotFocus: " + name);
            f.Show();
            f.Controls.Add(new TextBox { Location = new Point(0, 30) });
        };

        Form master = new Form { Controls = { tb, button } };
        Application.Run(master);
    }
}
(将其构建为一个控制台应用程序-这就是输出的方向。)

在文本框中输入一些名称并单击“新建表单”-然后再次执行。现在,在新表单的文本框之间单击-您将看到
激活的
事件被触发,但没有
GotFocus

有一个事件。

如何

请注意,控件上的GotFocus事件(表单从中派生,因此在此应用)标记为,将值false传递给,因此它在属性窗口中不可见


您应该在设计器生成的代码之外的代码中手动添加事件处理程序。

五年前我不知道,但现在:


Enter
事件起作用。

不,它对我的不起作用,因为我想要一个只在聚焦时发生的事件。什么时候激活它而不聚焦?嗨,Jon。我很好奇,每次你在表单上做任何事情时,激活的事件都会被触发吗?如果我的表单已获得焦点,并且我多次单击它,是否每次单击都会触发激活事件?@Chibbles:您必须进行测试以确保,但我相信只有当它以前未处于活动状态时才会触发激活事件。
激活
仅当表单获得焦点一次时才会触发,而不是当您在表单上执行任何操作时,刚刚测试过。它在属性窗口的事件列表中吗?是的,它适用于表单。它应该在事件列表中,但您始终可以直接对其进行编码:
myForm.GotFocus+=event\u handler是否在属性窗口的事件列表中??是否使用每个窗体上打开另一个窗体的按钮逐个切换这两个窗体?如果每次都使用ShowDialog()打开/显示窗体,则可以使用窗体加载事件。您如何在表单之间切换?