问题 什么是Control.IsHandleCreated需要?


我正在检查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 这会覆盖内置的 Control.ControlCollectionowner 是使用的TabControl ControlCollection


11197
2018-02-06 03:53


起源



答案:


的TabControl的 AddTabPage 方法(创建句柄时调用的方法)调用 AddNativeTabPage 方法。这反过来调用 SendMessage 和 PostMessage (有效, Control.Invoke 和 Control.BeginInvoke)添加标签页。这些方法封送了将标签页添加到UI线程,以便控件在内部服从 您不应该从后台线程与UI控件交互的规则

这实际上意味着如果创建了句柄, AddTabPage 从非UI线程调用是安全的(对于UI控件来说非常不寻常!)。不幸的是,这也意味着 AddTabPage 如果TabControl还没有句柄,方法会阻塞,因为没有UI线程抽取消息,因此除非创建句柄,否则不应该调用它。

对于好奇,这是在 TabControl.ControlsCollection 上课,在 Add 方法。


13
2018-02-06 04:02