2010-11-22 5 views

Antwort

7

Was genau bedeutet "voll geladen"? Meinst du, das "Load" Event wurde erfolgreich durchgeführt?

Sie können dies tun:

public class MyForm : Form { 
    protected override void OnLoad(EventArgs e) { 
     // the base method raises the load method 
     base.OnLoad(e); 

     // now are all events hooked to "Load" method proceeded => the form is loaded 
     this.OnLoadComplete(e); 
    } 

    // your "special" method to handle "load is complete" event 
    protected virtual void OnLoadComplete (e) { ... } 
} 

Aber wenn man „voll geladen“ bedeutet die „Form geladen und angezeigt“ Sie das „OnPaint“ -Methode zu überschreiben müssen.

public class MyForm : Form { 
    private bool isLoaded; 
    protected override void OnLoad(EventArgs e) { 
     // the base method raises the load method 
     base.OnLoad(e); 

     // notify the "Load" method is complete 
     this.isLoaded = true; 
    } 

    protected override void OnPaint(PaintEventArgs e) { 
     // the base method process the painting 
     base.OnPaint(e); 

     // this method can be theoretically called before the "Load" event is proceeded 
     // , therefore is required to check if "isLoaded == true" 
     if (this.isLoaded) { 
      // now are all events hooked to "Load" method proceeded => the form is loaded 
      this.OnLoadComplete(e); 
     } 
    } 

    // your "special" method to handle "load is complete" event 
    protected virtual void OnLoadComplete (e) { ... } 
} 
+0

Ich kann nicht glauben, dass niemand das noch heraufgebracht hat ... base.Load (e); erzeugt einen Fehler, 'Das Ereignis 'System.Windows.Forms.Form.Load' kann nur auf der linken Seite von + = oder - =' erscheinen. Aber diese Methode funktioniert immer noch nicht für mich. Die OnLoadComplete() wird ausgelöst, bevor das Formular gerade angezeigt wird. :( –

+0

Das ist wahrscheinlich, weil etwas die Methode OnPaint() aufgerufen hat, bevor das Formular angezeigt wird.Versuchen Sie, dort einen Breakpoint zu setzen und untersuchen Sie den Callstack. – TcKs

+0

Ich habe eine brandneue Anwendung und NUR haben die App folgendes tun. Die App startet und nachdem das Formular vollständig fertig ist, wird ein Begrüßungsbildschirm angezeigt. Aus dem, was ich sehen kann, ist dies die Reihenfolge der Ereignisse ... frm1: OnLoad startet, frm1: Laden beginnt, frm1: Laden beendet, frm1: OnLoad endet, frm1: OnPaint startet, frm2: Laden beginnt, frm2: Laden endet , frm2: DoubleClick startet, frm2: schließt, frm2: DoubleClick stoppt, frm1: OnPaint endet. Also, frm1 lädt und bevor es auftaucht (auf halbem Weg), erscheint frm2 sofort, dann nimmt frm1 wieder den Fokus, dann nimmt frm2 den letzten Fokus. Hinweis: frm2 ist randlos. –

-1

können Sie die Load-Ereignis des Formulars verwenden. Schreiben Sie im Konstruktor Ihres Formulars folgende Zeile

this.Load += new System.EventHandler(this.Form1_Load); 

und dann schreiben Sie die folgende Methode, in der Sie einige Dinge tun können.

void Form1_Load(object sender, EventArgs e) 
{ 
    // do some stuff here. 
} 
+0

-1 weil, wenn Sie das Load-Ereignis haken, Sie nicht wissen können, ob eine andere Methode nach dieser Methode nicht gehakt ist. Für eine ordnungsgemäße Funktion muss die "OnLoad" -Methode überschrieben werden. – TcKs

4

Ich denke, das OnLoad Ereignis nicht wirklich das, was Sie wollen, wie es vor tritt das Formular angezeigt wird. Sie können Application.Idle mit OnLoad verwenden, obwohl ein OnLoaded Ereignis zu machen:

protected override void OnLoad(EventArgs args) 
{ 
    Application.Idle += new EventHandler(OnLoaded); 
} 

public void OnLoaded(object sender, EventArgs args) 
{ 
    Application.Idle -= new EventHandler(OnLoaded); 
    // rest of your code 
} 
+1

Aber die Application.Idle kann eine lange Zeit nach dem Laden des Formulars ausgelöst werden. – TcKs

0

Mein Ansatz für die akzeptierte Antwort von TCKS ähnlich ist. Das Problem, dem ich gegenüberstand, war, dass ich einen Event-Handler für eine Gruppe von Steuerelementen hatte, die auf VisibleChanged reagierten, wobei der Event-Handler Steuerelemente innerhalb eines Panels bewegte. Problem war (natürlich), dass sich die Sichtbarkeit ändert, wenn das Formular zum ersten Mal geladen wird - aber nach dem .Load() - Ereignis.

I erstellt und einen Bool Wert für das Formular festgelegt:

private bool formShown = false; 

und fügte dann die folgende Zeile in der Form_Load()

this.Paint += (s, args) => { formShown = true; }; 

mit der ersten Zeile meines Visible() Ereignis Handler wie:

if(!formShown) { return; } 

Prägnant und funktional.

Verwandte Themen