【问题标题】:Setting WindowState to Maximized causes window to appear too early将 WindowState 设置为 Maximized 会导致窗口过早出现
【发布时间】:2012-03-21 14:28:56
【问题描述】:

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

有什么想法吗?

【问题讨论】:

  • 加载事件中的MessageBox.Show 将强制显示表单。
  • Load 事件中调整控件的大小有点可疑。为什么不依赖于控件的内置调整大小机制,例如DockAnchor 属性或TableLayoutPanel?当我稍后手动调整窗口大小时,您是否也会手动调整控件的大小?
  • 我也收到了。我在用户会话之间保存 WindowState,以便可以将表单的大小等调整为用户以前拥有的大小,当我将 WindowState 设置为 Maximized 时,我会出现很多闪烁等问题。有没有解决方案来解决这个问题?

标签: c# .net winforms resize windowstate


【解决方案1】:

尝试将 WindowState 的更改延迟到第一个 Activated 事件触发。这适用于我在带有 VS2005 和框架 2.0 的 VB.NET 中。

【讨论】:

  • 当窗口状态从最大化变为正常时,这对我有用。相反,我在窗口加载事件中将其设置为最大化。
【解决方案2】:

你必须设置 WindowState BEFORE InitializeComponent():

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

        InitializeComponent();
    }

【讨论】:

    【解决方案3】:

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

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

    This post详细解释

    【讨论】:

      【解决方案4】:

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

      您可以在 ctor 中调用 .Hide().Visible = False 并使其在 .Load 结束时再次可见

      【讨论】:

      • 将 visible 设置为 false 似乎没有任何效果。这可能与表单是应用程序的主要表单并通过 Application.run 显示的事实有关
      猜你喜欢
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      相关资源
      最近更新 更多