Установка 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 событие), пока окно видно. Если я не установил максимальное состояние, то все изменение размера будет выполнено до того, как будет показано окно (что я и ожидал).

Я мог бы отложить настройку WindowState до конца Load событие, но это все еще вызывает много мерцания, потому что окно становится видимым, а затем все элементы управления изменяют размер.

Какие-нибудь мысли?

4 ответа

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

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

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

        InitializeComponent();
    }

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

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

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

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

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

Другие вопросы по тегам