将WindowState设置为Maximized会导致窗口显示得太早

我读到Load事件应该在创建窗口句柄之后但窗口实际可见之前触发。 在大多数情况下,这似乎是真的。 但是,我发现当我创建一个WindowState属性设置为FormWindowState.Maximized (通过VS设计器,或者在构造函数中以编程方式),窗口在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事件期间Form.Load )的大小。 如果我没有将状态设置为最大化,那么所有resize都会在窗口显示之前完成(这是我所期望的)。

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

有什么想法吗?

尝试延迟WindowState的更改,直到第一个Activated事件触发。 这适用于VB.NET与VS2005和框架2.0。

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

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

这篇文章解释了更多细节

您必须初始化组件() 之前设置WindowState:

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

改变窗口外观的东西(例如resize)会导致窗口变得可见。

你可以在你的ctor中调用.Hide().Visible = False ,并在.Load的末尾再次显示它。