2012-02-06 14 views
11

Sto esaminando l'origine del controllo .net incorporato per TabControl e vedo che fa riferimento a questa proprietà prima di decidere se aggiungere o inserire una TabPage alla raccolta.A cosa serve Control.IsHandleCreated?

if (this.owner.IsHandleCreated) 
{ 
    this.owner.AddTabPage(tabPage, tabPage.GetTCITEM()); 
} 
else 
{ 
    this.owner.Insert(this.owner.TabCount, tabPage); 
} 

Entrambe le funzioni in ultima analisi, raggiungere lo stesso obiettivo - aggiungono il TabPage alla fine dei "TabPages" interni collezione ... ma io non vedo perché dovrebbe importa quale funzione in uso.

this riferisce al ControlCollection che sostituisce il Control.ControlCollection incorporato. owner è il TabControl che utilizza lo ControlCollection.

risposta

13

Il metodo AddTabPage di TabControl (quello che viene chiamato quando viene creato l'handle) chiama il metodo AddNativeTabPage. Che a sua volta chiama SendMessage e PostMessage (efficacemente, Control.Invoke e Control.BeginInvoke) per aggiungere la scheda. Questi metodi eseguono il marshalling dell'aggiunta della pagina di tabulazione al thread dell'interfaccia utente, in modo che il controllo esegua internamente l'ordine the rule that you shouldn't interact with UI controls from a background thread.

Ciò significa che se l'handle è stato creato, AddTabPage è sicuro da chiamare da thread non dell'interfaccia utente (molto inusuale per un controllo dell'interfaccia utente!). Sfortunatamente, ciò significa anche che il metodo AddTabPage si bloccherebbe se il TabControl non avesse ancora un handle, perché non ci sarebbero messaggi di pompaggio del thread UI e quindi non dovrebbe essere chiamato a meno che l'handle non sia stato creato.

Per i curiosi, questo è nella classe TabControl.ControlsCollection, nel metodo Add.