Установка WindowState в Maximized заставляет окно появляться слишком рано - PullRequest
7 голосов
/ 21 марта 2012

Я прочитал, что событие 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, но это все еще вызывает много мерцания, потому что окно становится видимым, а затем все элементы управления изменяют размер.

Есть мысли?

Ответы [ 4 ]

2 голосов
/ 22 декабря 2013

Попробуйте отложить изменение WindowState до первого активированного события.Это работает для меня в VB.NET с VS2005 и Framework 2.0.

1 голос
/ 22 марта 2015

Вы должны установить WindowState ДО InitializeComponent ():

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

        InitializeComponent();
    }
1 голос
/ 21 марта 2012

Если вам нужно поместить какое-то диагностическое сообщение в событие Load, используйте System.Diagnostics.Debug.WriteLine ();
Если вы используете MessageBox, вы уничтожите нормальный порядок потока событий.

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

Этот пост объясните подробнее

0 голосов
/ 21 марта 2012

Вещи, которые изменяют внешний вид окна (например, изменяя размер), делают окно видимым.

Вы можете вызвать .Hide() или .Visible = False в вашем ctor и сделать его снова видимым в конце .Load

...