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


События времени жизни объекта

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

Необходимые компоненты

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

События времени жизни объекта

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

Общие события времени жизни для элементов

Для любого элемента уровня платформы 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. Они расширяют общие события времени жизни дополнительными событиями, которые связаны с их конкретными целями. Эти темы подробно рассматриваются в следующих разделах.

См. также