C# 将WindowsState设置为最大化会导致窗口过早出现

C# 将WindowsState设置为最大化会导致窗口过早出现,c#,.net,winforms,resize,windowstate,C#,.net,Winforms,Resize,Windowstate,我读到Load事件应该在创建窗口句柄之后,但在窗口实际可见之前触发。在大多数情况下,这似乎是真的。但是,我发现,当我创建一个窗体时,将WindowState属性设置为FormWindowState.Maximized(通过VS设计器或在构造函数中以编程方式),在触发加载事件之前,该窗口会变得可见。例如: using System; using System.Windows.Forms; namespace MyApplication { public partial class MyF

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

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


有什么想法吗?

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


如果需要在Load event use System.Diagnostics.Debug.WriteLine()中添加一些诊断消息,您可以在ctor中调用
.Hide()
.Visible=False
,并在.Load的末尾使其再次可见
如果使用MessageBox,将破坏正常的事件流顺序

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

解释更多详细信息

尝试延迟Windows状态的更改,直到第一次激活事件触发。这对我来说在VB.NET中使用VS2005和framework 2.0是可行的。

您必须在初始化组件()之前设置WindowsState


加载事件中的
MessageBox.Show
将强制窗体显示。在
load
事件中调整控件的大小有些可疑。为什么不依赖内置的控件大小调整机制,如
Dock
Anchor
属性或
TableLayoutPanel
?当我稍后手动调整窗口大小时,您是否也会手动调整控件的大小?我也得到了这个。我正在用户会话之间保存WindowsState,以便表单可以调整大小,等等,以达到用户以前的大小。当我将WindowsState设置为最大化时,会出现大量闪烁等。是否有解决方案来修复此问题?设置visible to false似乎没有任何效果。这可能与窗体是应用程序的主窗体并通过应用程序显示这一事实有关。runThis在Windows状态从最大化更改为正常时对我起作用。相反,我在窗口加载事件中将其设置为最大化。
    public Form() //Constructor
    {
        WindowState = FormWindowState.Maximized;

        InitializeComponent();
    }