2012-02-06 17 views
11

Sprawdzam źródło wbudowanego formantu .net dla TabControl i widzę, że odwołuje się do tej właściwości przed podjęciem decyzji o dodaniu lub wstawieniu TabPage do kolekcji.Do czego służy Control.IsHandleCreated?

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

Obie funkcje ostatecznie osiągnąć ten sam cel - oni dodać tabpage do końca „wewnętrznych” TabPages kolekcji ... ale ja po prostu nie rozumiem, dlaczego to ma znaczenie, które funkcjonują użyć.

this odnosi się do ControlCollection, który zastępuje wbudowany Control.ControlCollection. owner to TabControl, który korzysta z ControlCollection.

Odpowiedz

13

Metoda TabControl AddTabPage (ta, która jest wywoływana podczas tworzenia uchwytu) wywołuje metodę AddNativeTabPage. To z kolei wywołuje SendMessage i PostMessage (skutecznie, Control.Invoke i Control.BeginInvoke), aby dodać stronę karty. Te metody kierują dodanie strony zakładki do wątku interfejsu użytkownika, aby kontrola była wewnętrznie zgodna z the rule that you shouldn't interact with UI controls from a background thread.

Oznacza to, że jeśli uchwyt został utworzony, można bezpiecznie wywołać AddTabPage z wątków innych niż interfejs użytkownika (bardzo rzadko w przypadku kontrolki interfejsu użytkownika). Niestety, oznacza to również, że metodablokowałaby, gdyby TabControl nie posiadał jeszcze uchwytu, ponieważ nie byłoby komunikatów pompowania wątków interfejsu użytkownika, a więc nie powinno się go wywoływać, chyba że został utworzony uchwyt.

Dla ciekawskich, jest to klasa TabControl.ControlsCollection, w metodzie .