2012-02-06 106 views
11

我正在檢查TabControl的內置.net控件的來源,並且在決定是否向集合中添加或插入TabPage之前,我看到它引用了此屬性。Control.IsHandleCreated需要什麼?

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

兩個功能,最終達到同一個目標 - 他們的的TabPage添加到內部「的TabPages」收集結束......但我只是不明白爲什麼它應該不管哪個函數使用。

this指的是覆蓋內置的Control.ControlCollectionControlCollectionowner是使用ControlCollection的TabControl。

回答

13

TabControl的AddTabPage方法(創建句柄時調用的方法)調用AddNativeTabPage方法。然後又調用SendMessagePostMessage(實際上,Control.InvokeControl.BeginInvoke)添加標籤頁。這些方法將標籤頁添加到UI線程,以便控件在內部服從the rule that you shouldn't interact with UI controls from a background thread

這實際上意味着如果句柄已創建,AddTabPage可以安全地從非UI線程調用(對於UI控制非常不尋常!)。不幸的是,這也意味着AddTabPage方法會阻塞如果TabControl還沒有句柄,因爲沒有UI線程抽取消息,所以除非句柄被創建,否則不應該調用它。

對於好奇,這是在TabControl.ControlsCollection類,在Add方法。