我正在检查TabControl的内置.net控件的来源,我看到它在决定是否向集合中添加或插入TabPage之前引用了这个属性。
if (this.owner.IsHandleCreated)
{
this.owner.AddTabPage(tabPage, tabPage.GetTCITEM());
}
else
{
this.owner.Insert(this.owner.TabCount, tabPage);
}
这两个函数最终实现了相同的目标 - 它们将TabPage添加到内部“TabPages”集合的末尾......但我不明白为什么它应该与您使用的函数有关。
this
指的是覆盖内置ControlCollection
的{{1}}。 Control.ControlCollection
是使用owner
的TabControl。
答案 0 :(得分:13)
TabControl的AddTabPage
方法(创建句柄时调用的方法)调用AddNativeTabPage
方法。这反过来调用SendMessage
和PostMessage
(实际上,Control.Invoke
和Control.BeginInvoke
)来添加标签页。这些方法封送了将标签页添加到UI线程,以便控件在内部服从the rule that you shouldn't interact with UI controls from a background thread。
这实际上意味着如果创建了句柄,AddTabPage
可以安全地从非UI线程调用(对于UI控件来说非常不寻常!)。不幸的是,这也意味着如果TabControl还没有句柄,AddTabPage
方法会阻塞,因为没有UI线程抽取消息,因此除非创建句柄,否则不应该调用它。
对于好奇,这是在TabControl.ControlsCollection
类,在Add
方法中。