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

时间:2012-03-21 14:28:56

标签: c# .net winforms resize windowstate

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

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事件结束,但这仍会导致大量闪烁,因为窗口变为可见,然后所有控件都会调整大小。

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

This post解释更多详情

答案 2 :(得分:1)

你必须设置WindowState BEFORE InitializeComponent():

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

        InitializeComponent();
    }

答案 3 :(得分:0)

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

您可以在您的ctor中拨打.Hide().Visible = False,并在.Load的末尾再次显示