7

我读到该Load事件应该在创建窗口句柄之后触发,但窗口实际变为可见之前。在大多数情况下,这似乎是真的。但是,我发现当我创建一个WindowState属性设置为的表单时(通过 VS 设计器,或在构造函数中以编程方式),窗口在事件触发FormWindowState.Maximized之前变为可见。Load例如:

using System;
using System.Windows.Forms;

namespace MyApplication
{
    public partial class MyForm : Form
    {
        public MyForm()
        {
            InitializeComponent();
            WindowState = FormWindowState.Maximized;
        }

        protected override void OnLoad(EventArgs e)
        {
            MessageBox.Show("OnLoad - notice that the window is already visible"); 
            base.OnLoad(e);
        }
    }
}

这反过来会导致显示的表单Form.Load在窗口可见时调整其控件(在事件期间布局)的大小时闪烁很多。如果我没有将状态设置为最大化,那么所有调整大小都会在显示窗口之前完成(这是我所期望的)。

我可以推迟设置WindowState直到Load事件结束,但这仍然会导致很多闪烁,因为窗口变得可见,然后所有控件都调整大小。

有什么想法吗?

4

4 回答 4

2

您必须在InitializeComponent()之前设置 WindowState:

    public Form() //Constructor
    {
        WindowState = FormWindowState.Maximized;

        InitializeComponent();
    }
于 2015-03-22T14:16:23.987 回答
2

尝试将 WindowState 的更改延迟到第一个 Activated 事件触发。这适用于我在带有 VS2005 和框架 2.0 的 VB.NET 中。

于 2013-12-22T10:09:56.587 回答
1

如果您需要在 Load 事件中添加一些诊断消息,请使用 System.Diagnostics.Debug.WriteLine();
如果你使用MessageBox,你会破坏事件的正常流序。

protected override void OnLoad(EventArgs e)         
{             
     System.Diagnostics.Debug.WriteLine("onLoad");              
     base.OnLoad(e);         
} 

这篇文章解释了更多细节

于 2012-03-21T14:54:43.617 回答
0

改变窗口外观的事情(例如调整大小)会导致窗口变得可见。

您可以在您的 ctor 中调用.Hide()or.Visible = False并使其在 .Load 结束时再次可见

于 2012-03-21T14:33:07.953 回答