Какое событие запускается сразу после полной загрузки Control? - PullRequest
1 голос
/ 05 сентября 2011

У меня есть пользовательский элемент управления, который переопределяет элемент управления WebBrowser.Есть метод, который берет область BackgroundImage из родительской формы и делает его своим фоном в HTML-коде.Это работает так:

  1. Делает себя невидимым.
  2. Захватывает родительскую форму.
  3. Делает себя видимым.
  4. Занимает определенную область захваченногоimage и устанавливает его в качестве фона.
  5. Обновляет себя.

Я хочу, чтобы этот метод был запущен сразу после полной загрузки элемента управления.Я не могу сделать это в конструкторе, потому что некоторые важные объекты и родительские свойства, которые мне нужно использовать, по-прежнему нулевые.Я поместил его в событие OnVisibleChanged и установил для переменной bool значение false, чтобы он запускался только один раз, но он запускается каждый раз, когда я перестраиваю свой проект (даже без запуска - он создает растровое изображение, которое я использую в качестве фона в HTML-коде, но в другом каталоге, потомуиспользуйте метод Directory.CurrentDirectory ()).Пробовал также запускать его с событием OnLoad, но это создает ту же проблему, что и OnVisibleChanged.Есть ли для этого более подходящее событие, чем OnVisibleChanged?

PS.Мне всегда было интересно, должно ли каждое событие запускать событие своего базового класса.Нужно ли это делать?Я не вижу никакой разницы вообще, без этого все прекрасно работает.Если лучше оставить это там, должно ли это быть в начале или в конце метода события?

1 Ответ

3 голосов
/ 05 сентября 2011

Нет понятия «полностью загружен», создание элемента управления является атомарной операцией в Winforms и сигнализируется OnHandleCreated (). То, что вы ищете здесь, имеет полностью окрашенный элемент управления . Рисование - это задача с низким приоритетом в Windows, которая выполняется только тогда, когда больше ничего не нужно делать.

Получите это уведомление, переопределив WndProc () и перехватив WM_PAINT:

bool fullyPainted = false;

protected override void WndProc(ref Message m) {
    base.WndProc(ref m);
    if (m.Msg == 15 && !fullyPainted) {
        fullyPainted = true;
        // etc...
    }
}
...