Подтвердить что ты не робот

Схема жизненного цикла пользовательского контроля WPF?

Я ищу диаграмму, которая будет служить ссылкой для отображения порядка событий и переопределений, которые вызывают для пользовательских элементов управления WPF, которые происходят из общих классов, таких как FrameworkElement, UIElement, Control, ContentControl, Decorator и т.д.

Меня особенно интересуют события и переопределения, связанные с тем, что процесс управления становится видимым и готовым к взаимодействию. Другими словами, меня не интересует эта диаграмма, показывающая события, которые могут иметь дело с пользователем, взаимодействующим с элементом управления, после того, как он готов к взаимодействию, например, такие как MouseLeftButtonDown.

Я ищу что-то вроде этой диаграммы (диаграммы, подобные этим, объясняют lifecyle окна или приложения WPF), но для пользовательские элементы управления.

Я также видел эту страницу, что, на мой взгляд, кажется слишком упрощенным. Эта страница, по-видимому, в основном говорит о том, что в основном есть события Initialized, Loaded и Unloaded. Чтобы проиллюстрировать, некоторые из общих событий/переопределений, которые я должен использовать в пользовательских элементах управления, включают:

  • Конструктор
  • Loaded
  • Unloaded
  • IsVisibleChanged
  • OnApplyTemplate

Наряду со слегка более специализированными переопределениями, такими как Popup OnOpened и Expander OnExpanded и т.д.

Проблема, с которой я сталкиваюсь, заключается в том, что я забываю, когда могу делать что-то вроде VisualStateManager.GoToState(...) (OnApplyTemplate - это первый реальный шанс, который я считаю). И я также продолжаю открывать события, которые мне нужно использовать, например, IsVisibleChanged (это событие оказалось необходимым, когда мне понадобился элемент управления для изменения состояния "перезагрузить/обновить", когда пользователь вернется на вкладку, содержащую мой элемент управления), Поэтому я продолжаю задаваться вопросом, есть ли еще такие события/переопределения, на которые я действительно должен обратить внимание на пользовательский контроль? Здесь поможет диаграмма, которая показывает эти вещи по отношению друг к другу.

Учитывая эти типы событий/переопределений, этот график Silverlight довольно близок к тому, что я ищу, , но для WPF. Некоторые из комментаторов этого сообщения говорят, что события/переопределения WPF отличаются от событий Silverlight. Если да, можете ли вы указать мне на аналогичную диаграмму?

Чтобы еще раз показать необходимость такой диаграммы, рассмотрите следующую последовательность событий, которые я только что наблюдал в пользовательском элементе управления, который происходит из ContentControl:

  • Приложение запущено. (Мой пользовательский элемент управления находится на другой вкладке, чем вкладка intial.)
  • Initialized обратный вызов события называется
  • Loaded обратный вызов события называется
  • (я нажимаю на вкладку, содержащую мой пользовательский элемент управления)
  • IsVisibleChanged обратный вызов события называется
  • OnApplyTemplate переопределение называется
  • Loaded обратный вызов события называется
  • Loaded вызов вызова вызова снова
  • Loaded обратный вызов события, вызываемый третий раз подряд.
  • (теперь управление полностью видимо и готово к взаимодействию)
4b9b3361

Ответ 1

Я сомневаюсь, что такая всеобъемлющая диаграмма существует. Как насчет того, чтобы вы сами сделали это? Переопределите все методы и/или события, которые вас интересуют, и поместите Trace.WriteLine(new StackFrame(1).GetMethod().Name); в каждое переопределение. Ваш результат сообщит вам, в каком порядке они были вызваны.

Ответ 2

  • Инициализируется только один раз и первый
  • OnApplyTemplate называется вторым, и всякий раз, когда изменяется шаблон
  • Loaded вызывается, когда элемент управления готов к отображению и всякий раз, когда определенные контейнеры перезагружают их содержимое (в частности, обмениваются между TabItems)
  • IsVisibleChanged вызывается всякий раз, когда видимость изменяется, и после загрузки

Выгружается, как правило, не вызывается, если вы не находитесь в TabItem, и вы меняете на другой.

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