将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的末尾再次显示它。