Для чего нужен Control.IsHandleCreated? - PullRequest
11 голосов
/ 06 февраля 2012

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

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 Ответ

13 голосов
/ 06 февраля 2012

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

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

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

...