什么是Control.IsHandleCreated需要?

时间:2012-02-06 03:53:41

标签: c# winforms tabcontrol

我正在检查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。

1 个答案:

答案 0 :(得分: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控件来说非常不寻常!)。不幸的是,这也意味着如果TabControl还没有句柄,AddTabPage方法会阻塞,因为没有UI线程抽取消息,因此除非创建句柄,否则不应该调用它。

对于好奇,这是在TabControl.ControlsCollection类,在Add方法中。