gpt4 book ai didi

c# - 需要什么 Control.IsHandleCreated?

转载 作者:可可西里 更新时间:2023-11-01 08:43:05 45 4
gpt4 key购买 nike

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

最佳答案

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

关于c# - 需要什么 Control.IsHandleCreated?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9155413/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com