Для чего нужен Control.IsHandleCreated?

Я изучаю источник встроенного элемента управления .net для TabControl, и я вижу, что он ссылается на это свойство, прежде чем принимать решение о добавлении или вставке вкладки в коллекцию.

if (this.owner.IsHandleCreated)
{
    this.owner.AddTabPage(tabPage, tabPage.GetTCITEM());
}
else
{
    this.owner.Insert(this.owner.TabCount, tabPage);
}

Обе функции в конечном итоге достигают одной и той же цели - они добавляют TabPage к концу внутренней коллекции "TabPages"... но я просто не понимаю, почему это важно, какую функцию вы используете.

this относится к ControlCollection, который переопределяет встроенный Control.ControlCollection. owner - это TabControl, который использует ControlCollection.

Ответ 1

Метод TabControl AddTabPage (тот, который вызывается при создании дескриптора) вызывает метод AddNativeTabPage. Это, в свою очередь, вызывает SendMessage и PostMessage (эффективно, Control.Invoke и Control.BeginInvoke) для добавления закладки. Эти методы маршалируют добавление закладки на поток пользовательского интерфейса, поэтому элемент управления внутренне подчиняется правило, с которым вы не должны взаимодействовать с элементами управления пользовательского интерфейса от фоновый поток.

Это на самом деле означает, что если дескриптор создан, AddTabPage безопасен для вызова из потоков, отличных от UI (очень необычный для элемента управления пользовательского интерфейса!). К сожалению, это также означает, что метод AddTabPage блокирует, если TabControl еще не имеет дескриптора, потому что не будет сообщений о потоке потока пользовательского интерфейса, и поэтому его нельзя вызывать, если не создан дескриптор.

Для любопытных это находится в классе TabControl.ControlsCollection в методе Add.