2012-03-21 18 views
7

Czytam, że zdarzenie Load powinno zostać wywołane po utworzeniu klamki okna, ale okno staje się widoczne. W większości przypadków wydaje się to prawdą. Jednak odkryłem, że po utworzeniu formularza z ustawieniem właściwości WindowState na FormWindowState.Maximized (przez projektanta VS lub programowo w konstruktorze), okno staje się widoczne przed wywołaniem zdarzenia Load. Na przykład:Ustawienie WindowState na zmaksymalizowane powoduje, że okno pojawia się zbyt wcześnie

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); 
     } 
    } 
} 

To z kolei powoduje, że wyświetlany formularz migotać dużo podczas jego kontrole (które są określone w trakcie imprezy Form.Load) są zmniejszane, gdy okno jest widoczne. Jeśli nie ustawiłem stanu, który ma być zmaksymalizowany, wówczas wszystkie zmiany rozmiaru są wykonywane przed wyświetleniem okna (co jest tym, czego oczekiwałbym).

Mogłem wstrzymać się przy ustawianiu WindowState do końca zdarzenia Load, ale to nadal powoduje migotanie, ponieważ okno staje się widoczne, a następnie wszystkie rozmiary kontrolek są zmieniane.

Jakieś myśli?

+3

że 'MessageBox.Show' w przypadku obciążenia zmusi formularz, aby pokazać. – LarsTech

+1

Zmiana rozmiaru elementów sterujących w przypadku zdarzenia "Wczytaj" jest dość podejrzana. Dlaczego nie polegasz na wbudowanych mechanizmach zmiany wielkości kontrolek, takich jak właściwości 'Dock' lub' Anchor' lub 'TableLayoutPanel'? Czy ręcznie zmienisz rozmiar kontrolek, gdy później ręcznie zmienisz rozmiar okna? –

+0

Dostaję to również. Zapisuję WindowState między sesjami użytkowników, aby można było zmienić rozmiar formularza, itp., Do tego, co wcześniej miał użytkownik, a kiedy ustawiłem WindowState na Maximized, dostaję dużo migotania, itp. Czy istnieje rozwiązanie, aby to naprawić? –

Odpowiedz

0

Rzeczy, które zmieniają wygląd okna (zmiana rozmiaru na przykład) powodują, że okno staje się widoczne.

Można zadzwonić .Hide() lub .Visible = False w ctor i uczynić go ponownie widoczne pod koniec .load

+0

Ustawienie widoczne jako fałsz nie ma żadnego efektu. Może to mieć coś wspólnego z faktem, że formularz jest główną formą aplikacji i wyświetlany przez Application.run – user1283610

1

Jeśli chcesz umieścić jakiś komunikat diagnostyczny w korzystaniu zdarzenie obciążenia System.Diagnostics.Debug.WriteLine() ;
Jeśli użyjesz MessageBox, zniszczysz normalną kolejność zdarzeń.

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

This post wyjaśnić więcej szczegółów na

2

Spróbuj opóźnić zmiany WindowState aż do pierwszej aktywacji wypalania zdarzeń. Działa to dla mnie w VB.NET z VS2005 i framework 2.0.

+0

To działało dla mnie, gdy stan okna zmienił się na normalny z zmaksymalizowanego. Zamiast tego ustawiam go na zmaksymalizowany w oknie Load zdarzenia. – NielW

1

Musisz ustawić WindowState PRZED InitializeComponent():

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

     InitializeComponent(); 
    }