несколько раз HandleCreated для одного элемента управления - PullRequest
2 голосов
/ 24 декабря 2008

Я использую элемент управления, который необходимо зарегистрировать для асинхронных событий. События будут генерироваться в потоке пользовательского интерфейса с использованием интерфейса ISynchronizeInvoke , реализованного элементами управления WinForms

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

Решение этой проблемы заключается в использовании асинхронной регистрации события из обработчика события в HandleCreated вместо регистрации в конструкторе.

однако это создает другую проблему, в некоторых случаях событие HandleCreated вызывается многократно в результате изменения состояния управления. Например, каждое изменение свойства «RightToLeft» вызывает сообщение WMCreate, которое вызывает событие «HandleCreated».

Как я могу предотвратить умножение времени нарастания события? Есть ли другой способ узнать, когда элемент управления создается и отображается впервые?

Я могу сохранить логический флаг в HandleCreated, однако это похоже на взлом, и мне интересно, есть ли лучший способ справиться с этой проблемой.

Ответы [ 2 ]

1 голос
/ 28 апреля 2009

Рассматривали ли вы использовать событие Load? Неуправляемый дескриптор, безусловно, доступен в тот момент.

1 голос
/ 24 декабря 2008

Разве вы не можете просто переопределить CreateHandle и проверить RecreatingHandle? Вы также можете переопределить DestroyHandle, чтобы поймать это.

...