Возможно, надеемся на чудо, но давайте попробуем: -)
MyControl происходит от Control.Его ControlTemplate содержит
<ContentPresenter ContentTemplate="{TemplateBinding EditorTemplate}"/>
(другие подробности опущены.)
Производные элементы управления предоставляют подходящий EditorTemplate.Например, MyTextControl указывает шаблон, состоящий из TextBox.(Конечно, с правильными привязками.)
Я не буду описывать, что работает (большинство сценариев), а что нет:
Создается свернутый экземпляр MyTextControl.Позже этот контроль становится видимым.Вот что происходит:
- Создан экземпляр MyTextControl, установлено значение Collapsed
- Событие MyTextControl.Loaded: на данный момент визуальное дерево содержит MyTextControl без дочерних элементов.
- В обработчике Loaded я вызываю ApplyTemplate ().В свою очередь, визуальное дерево изменяется на MyTextControl -> ContentPresenter.Вот и все, больше нет детей.
- Стил в Loaded-обработчике, я назначаю Loaded-обработчик ContentPresenter.
- Иногда позже элемент управления становится видимым.Его визуальное дерево заполняется внутренними объектами TextBox: Border -> ContentControl -> ContentPresenter -> внутренний TextBoxView.Другими словами, элемент управления просто работает.
Проблема в том, что Обработчик загруженного ContentPresenter не был вызван , т.е. я не могу определить момент, когда элемент управления готов.
Я попробовал альтернативное решение, т.е. вместо форсирования ApplyTemplate () я просто ждал в MyControl.OnApplyTemplate ().Последовательность:
- Создан экземпляр MyTextControl, установлено значение Collapsed
- В обработчике Loaded визуальное дерево содержит MyTextControl без дочерних элементов.
- Элемент управления становится видимым.
- В OnApplyTemplate () визуальным деревом является MyTextControl-> ContentPresenter.
- Стил в OnApplyTemplate (), я назначаю обработчик Loaded для ContentPresenter.
- Остальное как и раньше,Визуальное дерево заполняется внутренними компонентами TextBox (элемент управления работает), но вышеупомянутый обработчик не вызывается.
Кто-нибудь знает способ, как определить момент, когда элемент управления полностью загружен?
Обратите внимание, что я проделал вышеупомянутое с несколькими другими производными от MyControl элементами управления.Для каждого из них работал один из указанных выше сценариев (иногда один, иногда другой), но элемент управления на основе TextBox является первым, в котором я не могу определить момент загрузки.
Также обратите внимание, что эта проблемане происходит, когда элемент управления виден постоянно.