2012-02-06 36 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); 
} 

どちらの関数は、最終的には同じ目標を達成 - 彼らは内部の「TabPages」コレクションの末尾にのTabPageを追加...しかし、あなたが使用し機能している問題ではなければならない理由を私は表示されません。

thisは、組み込みのControl.ControlCollectionを無効にするControlCollectionを指します。 ownerは、ControlCollectionを使用しているTabControlです。

答えて

13

(ハンドルの作成時に呼び出される)TabControlのメソッドは、AddNativeTabPageメソッドを呼び出します。その結果、SendMessagePostMessage(実質的にはControl.InvokeControl.BeginInvoke)が呼び出され、タブページが追加されます。これらのメソッドは、コントロールが内部的にthe rule that you shouldn't interact with UI controls from a background threadに従うように、UIスレッドにタブページの追加をマーシャリングします。

実際には、ハンドルが作成されている場合、AddTabPageはUI以外のスレッドから安全に呼び出すことができます(UIコントロールでは非常に珍しいです)。残念ながら、これは、TabControlにまだハンドルがない場合はAddTabPageメソッドがブロックされることを意味します。UIスレッドのポンピングメッセージがないため、ハンドルが作成されない限り呼び出されるべきではありません。

これは、TabControl.ControlsCollectionクラスのAddメソッドです。

関連する問題