为什么不是this.Hide()在Form1_load事件中工作?

时间:2011-08-09 22:04:43

标签: c#

我实际上有一个经典的Windows窗体和一个按钮。我有这个代码

    private void Form1_Load(object sender, EventArgs e)
    {
        this.Hide();
        this.Visible = false;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Hide();
    }

我想知道为什么在加载后不会隐藏表单,但是当我点击该按钮时它会起作用?有人可以解释一下吗?

3 个答案:

答案 0 :(得分:12)

在窗体实际可见之前会触发Load事件。尝试使用Form.Shown事件。当窗体实际绘制在屏幕上时,这将触发。

答案 1 :(得分:4)

因为您在显示表单之前调用了Hide()。

http://msdn.microsoft.com/en-us/library/86faxx0d.aspx

答案 2 :(得分:3)

Visible属性对表单来说是一个非常大的问题。与传统的.NET编程模型联系在一起,只在最后一刻分配资源。懒惰。

在创建本机Windows窗口之后立即触发Load事件,就在用户可以看到之前。设置Visible = true的行为会触发此事件链。或者更典型地,调用Show()方法。完全相同的事情。直到那时,原生窗口才重要。

然而,这有副作用,在设置Visible = true的过程中,您不能将Visible设置为false(或调用Hide,同样的事情)。这就是你的代码不起作用的原因。

如果您有NotifyIcon并且在用户单击图标之前不想让窗口可见,则可以获得您想要的内容,而不是非常不寻常。在创建表单之前,NI无法工作。看起来像这样:

    protected override void SetVisibleCore(bool value) {
        if (!IsHandleCreated && value) {
            base.CreateHandle();
            value = false;
        }
        base.SetVisibleCore(value);
    }

这使您可以第一次调用Show(),但实际上并没有获得可见窗口。在此之后它表现正常。请注意Load事件不会运行,最好不要使用它。