将WindowState设置为Maximized会导致窗口过早出现

8

我看到 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事件结束,但这仍然会导致很多闪烁,因为窗口变得可见,然后所有控件都会重新调整大小。
有什么想法吗?

3
هœ¨Loadن؛‹ن»¶ن¸­çڑ„MessageBox.Showن¼ڑه¼؛هˆ¶وک¾ç¤؛çھ—ن½“م€‚ - LarsTech
1
在“Load”事件中调整控件的大小有点可疑。为什么不依赖于控件的内置调整机制,比如DockAnchor属性或者TableLayoutPanel呢?当我之后手动调整窗口大小时,你也会手动调整控件的大小吗? - Thorsten Dittmar
1
我也遇到了这个问题。我在用户会话之间保存WindowState,以便可以将窗体调整大小等到用户先前设置的状态,但是当我将WindowState设置为Maximized时,会出现很多闪烁等问题。有没有解决方法? - John Grabanski
4个回答

2

在调用InitializeComponent()之前,您需要设置WindowState:

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

        InitializeComponent();
    }

2

尝试延迟 WindowState 的更改直到第一个 Activated 事件触发。这在使用 VB.NET、VS2005 和 framework 2.0 时对我有效。


当窗口状态从最大化更改为正常时,这对我有用。相反,我在窗口加载事件中将其设置为最大化。 - NielW

1
如果您需要在Load事件中放置一些诊断消息,可以使用System.Diagnostics.Debug.WriteLine();
如果您使用MessageBox,将破坏事件的正常流程顺序。
protected override void OnLoad(EventArgs e)         
{             
     System.Diagnostics.Debug.WriteLine("onLoad");              
     base.OnLoad(e);         
} 

这篇文章解释了更多细节


0

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

您可以在构造函数中调用.Hide().Visible = False,并在.Load结束时再次使其可见。


将可见性设置为false似乎没有任何效果。这可能与该窗体是应用程序的主窗体并通过Application.run显示有关。 - user1283610

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接