Установка 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