Поделиться через


События времени существования объекта

В этом разделе описываются конкретные события WPF, которые свидетельствуют о этапах существования объекта при создании, использовании и уничтожении.

Необходимые условия

В этом разделе предполагается, что вы понимаете зависимые свойства с точки зрения потребителя существующих зависимых свойств в классах Windows Presentation Foundation (WPF) и прочитали тему Обзор зависимых свойств. Чтобы следовать примерам в этом разделе, также следует понять XAML (см. XAML в WPF) и узнать, как писать приложения WPF.

События времени существования объекта

Все объекты в управляемом коде Microsoft .NET Framework проходят аналогичный набор этапов жизни, создания, использования и уничтожения. Многие объекты также имеют этап завершения жизни, который происходит в рамках этапа уничтожения. Объекты WPF, в частности визуальные объекты, которые WPF идентифицирует как элементы, также имеют набор общих этапов жизни объекта. Модели программирования и приложений WPF предоставляют эти этапы в виде ряда событий. Существует четыре основных типа объектов в WPF в отношении событий жизненного цикла: элементы в целом, элементы окна, узлы навигации и объекты приложения. Узлы Windows и навигации также находятся в составе более общей группы визуальных элементов. В этом разделе описываются события жизненного цикла, которые являются общими для всех элементов, и далее рассматриваются более конкретные события, которые применяются к определениям приложений, окнам или навигационным узлам.

Распространенные события времени существования элементов

Любой элемент уровня платформы WPF (эти объекты, производные от FrameworkElement или FrameworkContentElement), имеют три распространенных события существования: Initialized, Loadedи Unloaded.

Инициализировано

Initialized сначала вызывается и примерно соответствует инициализации объекта вызовом его конструктора. Так как событие происходит в ответ на инициализацию, вы гарантируете, что заданы все свойства объекта. (Исключением является использование выражений, таких как динамические ресурсы или привязка; эти выражения не будут оценены.) В результате требования, что все свойства должны быть заданы, последовательность события Initialized запускается вложенными элементами, определенными в разметке, в порядке от самых глубоких элементов дерева к родительским, в направлении корня. Этот порядок обусловлен тем, что отношения "родитель-дитя" и "включение" являются свойствами, и, следовательно, родительский объект не может объявлять об инициализации, пока дочерние элементы, составляющие свойство, не будут полностью инициализированы.

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

Загружено

Loaded поднимается следующим шагом. Событие Loaded вызывается до окончательной отрисовки, но после того, как система макета вычисляет все необходимые значения для отрисовки. Loaded означает, что логическое дерево, в котором содержится элемент, является полным и подключено к источнику визуализации, который предоставляет HWND и поверхность отрисовки. Стандартная привязка данных (привязка к локальным источникам, например к другим свойствам или непосредственно определенным источникам данных) произошла до Loaded. Возможно, произошла асинхронная привязка данных (внешние или динамические источники), но по определению своей асинхронной природы она не может быть гарантирована.

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

Заметка

Это поведение может поверхностно напоминать туннелирование для маршрутизируемого события. Однако никакие сведения не передаются из события в событие. Каждый элемент всегда имеет возможность обрабатывать своё событие Loaded, и пометка данных события как обработанных не влияет на другие элементы.

Разгружен

Unloaded вызывается последним и инициируется либо источником презентации, либо при удалении визуального родителя. Когда Unloaded вызывается и обрабатывается, элемент, который является родительским элементом источника события (как определено свойством Parent) или любой заданный элемент по логическим или визуальным иерархиям вверх, возможно, уже не установлен, то есть привязка данных, ссылки на ресурсы и стили не могут быть заданы в их обычные или последние известные значения во время выполнения.

Элементы модели приложений жизненного цикла событий

Следующие элементы модели приложения основываются на распространенных событиях времени существования элементов: Application, Window, Page, NavigationWindowи Frame. Они расширяют общеупотребительные события жизненного цикла дополнительными событиями, соответствующими их конкретной предназначенности. Эти сведения подробно рассматриваются в следующих местах:

См. также