我读到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
事件结束,但这仍会导致大量闪烁,因为窗口变为可见,然后所有控件都会调整大小。
有什么想法吗?
答案 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的末尾再次显示