【问题标题】:What is Control.IsHandleCreated needed for?Control.IsHandleCreated 需要什么?
【发布时间】:2012-02-06 03:53:40
【问题描述】:

我正在检查 TabControl 的内置 .net 控件的源代码,我发现它在决定是向集合中添加还是插入 TabPage 之前引用了此属性。

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。

【问题讨论】:

    标签: c# winforms tabcontrol


    【解决方案1】:

    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 方法中。

    【讨论】:

      猜你喜欢
      • 2019-06-09
      • 1970-01-01
      • 2015-01-26
      • 2020-12-14
      • 2012-03-11
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      相关资源
      最近更新 更多