События времени жизни объекта
В этом разделе описываются конкретные события WPF, обозначающие этапы времени жизни объекта, а именно создание, использование и уничтожение.
В этом разделе содержатся следующие подразделы.
- Предварительные требования
- События времени жизни объекта
- Общие для элементов события времени жизни
- Элементы модели приложения событий времени жизни
- Связанные разделы
Предварительные требования
В этом разделе предполагается, что вы понимаете свойства зависимости с точки зрения потребителя существующих свойств зависимости классов Windows Presentation Foundation (WPF) и ознакомлены с разделом Общие сведения о свойствах зависимости. Чтобы следовать примерам в этой главе, необходимо также понимать Extensible Application Markup Language (XAML) (см. Общие сведения о языке XAML (WPF)) и знать как писать приложения WPF.
События времени жизни объекта
Все объекты в управляемом коде Microsoft .NET Framework проходят через один и тот же набор жизненных этапов, а именно создание, использование и уничтожение. У многих объектов также существует этап завершения как часть этапа уничтожения. Объекты WPF, особенно визуальные объекты, которые WPF определяет как элементы, также имеют набор общих этапов жизни объекта. Программирование WPF и модели приложений предоставляет эти этапы как последовательность событий. Существуют четыре основных типа объектов в WPF по отношению к времени жизни события; элементы в общем, элементы окна, узлы переходов и объекты приложения. узлы окон и переходов также подвергаются группировке визуальных объектов (элементов). В этом разделе описываются события времени жизни, которые являются общими для всех элементов, а затем представлены конкретные, которые применяются к определениям приложений, узлам окон и переходов.
Общие для элементов события времени жизни
Любой элемент уровня WPF framework (объекты, производные от FrameworkElement или FrameworkContentElement) имеют три общих события времени жизни: Initialized, Loaded, и Unloaded.
Initialized
Initialized возникает первым и примерно соответствует инициализации объекта при вызове его конструктора. Так как событие произошло в ответ на инициализацию, есть гарантия, что все свойства объекта установлены. (Исключением является применение таких выражений, как динамические ресурсы или привязки; это будут необработанные выражения.) Как следствие потребностей, установленных для всем свойств, последовательность Initialized, вызванных вложенными элементами, которые определены в разметке, сначала отображается в порядке вложенности элементов в дереве элементов, затем от родительского элемента к корню. Этот последовательность вызвана тем, что связь типа «родители-потомки» и объединение являются свойствами, и, таким образом, родитель не завершит инициализацию до тех пор, пока дочерние элементы, заполняющие свойство, также не будут полностью инициализированы.
При написании обработчика в ответ на событие Initialized следует учитывать, что нет гарантии, что все остальные элементы в дереве элементов (логическом дереве или визуальном дереве), к которому прикреплен обработчик, уже были созданы, особенно родительские элементы. Переменные-члены могут быть NULL, или источники данных могут не еще заполняться через базовую привязку (даже на уровне выражения).
Loaded
Loaded вызывается далее. Событие Loaded создается перед окончательной отрисовкой, но после того, как система макета вычислила все необходимые значения для отображения. Из события Loaded следует, что логическое дерево, в котором содержится элемент, готово и связано с источником представления, который предоставляет HWND и поверхность для отрисовки. Стандартная привязка данных (привязка к локальному источнику, такому как другие свойства или явно определенные источник данных) произойдет до Loaded. Асинхронная привязка данных (к внешнем или динамическим источникам) может произойти, но, по определению асинхронности, нет гарантии, что она произошла.
Механизм, по которому возникает событие Loaded, отличается от Initialized. Событие Initialized является вызванным элементом, без прямого согласования с завершенным деревом элементов. Напротив, событие Loaded вызывается в качестве согласованного усилия по всему дереву элементов (в частности, логическому дереву). Когда все элементы в дереве находятся в состоянии, в котором они считаются загруженными, событие Loaded сначала вызывается в корневом элементе. Затем событие Loaded вызывается последовательно для каждого дочернего элемента.
![]() |
---|
Такое поведение может внешне напоминать нисходящую маршрутизацию маршрутизированного события.Однако, сведения не переносятся от события к событию.Каждый элемент всегда имеет возможность обработать свое событие Loaded, и пометить данные о событии, как не имеющие эффекта за пределами этого элемента. |
Unloaded
Unloaded вызывается последним и инициируется источником представления или визуальным родительским элементом при его удалении. Когда Unloaded возникает и обрабатывается, элемент, который является родительским источником события (как определено свойством Parent), или любой заданный элемент в логических или визуальных деревьях могут уже быть сброшен, что означает, что связывание данных, ссылки на ресурсы и стили могут быть не установлены в обычное или последнее известное значение времени выполнения.
Элементы модели приложения событий времени жизни
Следующие элементы модели приложения построены на общих событиях времени жизни: Application, Window, Page, NavigationWindow, и Frame. Это расширяет общие события времени жизни дополнительными событиями, предназначенными для определенных целей. Они описаны в подробно в следующих разделах: