将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事件期间布置)在窗口可见时调整大小。如果我没有将状态设置为最大化,那么所有的调整大小都会在窗口显示之前完成(这是我所期望的)。

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

有什么想法吗?

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

您必须设置WindowStateBEFOREInitializeComponent():

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

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

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

这篇文章解释了更多的细节

更改窗口外观(例如调整大小)会使窗口变得可见。

您可以在ctor中调用.Hide().Visible = False,并在的末尾使其再次可见。Load

最新更新