Наследование значения свойства

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

Наследование значения свойства является наследованием вложений

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

Практическое применение наследования значения свойства

API-интерфейсы WPF включают несколько свойств, в которых включено наследование свойства. Как правило, сценарий для них состоит во включении свойства там, где уместно устанавливать свойство только один раз на странице, но это свойство также является членом одного из базовых классов элементов и, таким образом, может существовать в большинстве дочерних элементов. Например, элементы управления свойствами FlowDirection, направленный поток содержимого которых должен быть представлен и организован на странице. Как правило, требуется, чтобы концепция направления текста согласованно обрабатывалась во всех дочерних элементах. Если направление передачи по какой-то причине было прервано на некотором уровне дерева элементов в результате действия пользователя или среды, то оно должно быть перезапущено повсюду. Если свойство FlowDirection создается для наследования, значение нужно установить или сбросить только один раз на уровне в дереве элементов, который охватывает требования к представлению каждой страницы приложения. Таким образом будет наследоваться даже начальное значение по умолчанию. Модель наследования значений свойств также позволяет отдельным элементам сбрасывать значение в тех редких случаях, когда сочетание направлений текста является преднамеренным.

Создание настраиваемого наследуемого свойства

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

Чтобы свойство участвовало в наследовании значения, создайте настраиваемое присоединенное свойство, как описано в разделе Регистрация присоединенного свойства. Зарегистрируйте свойство с помощью метаданных (FrameworkPropertyMetadata) и укажите параметр «Наследует» в настройках параметров в этих метаданных. Также убедитесь, что для свойства задано значение по умолчанию, так как теперь это значение будет наследоваться. Несмотря на регистрацию свойства как присоединенного, можно создать "оболочку" свойства для получения/настройки доступа к типу владельца точно так же, как и для "неприсоединенного" свойства зависимостей. После этого наследуемое свойство можно установить либо с помощью прямой программы-оболочки свойства для типа владельца или производных типов, либо с помощью синтаксиса присоединенного свойства в любом DependencyObject.

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

Примечание.

Несмотря на то что наследование значения свойства может выполняться для неприсоединенных свойств зависимостей, поведение наследования для таких свойств через определенные границы элементов в дереве среды выполнения не определено. Для регистрации свойств всегда используйте RegisterAttached, если в метаданных указываете Inherits.

Наследование значений свойств за границами дерева

Наследование свойств работает путем обхода дерева элементов. Это дерево часто параллельно логическому дереву. Однако при включении объекта уровня ядра WPF в разметку, определяющую дерево элементов, например Brush, создается несплошное логическое дерево. Истинное логическое дерево концептуально не расширяется через Brush, потому что логическое дерево является концепцией уровня среды WPF. Это отражается в результатах при использовании методов LogicalTreeHelper. Тем не менее наследование значения свойства может устранить этот разрыв в логическом дереве и по-прежнему передавать унаследованные значения, пока наследуемое свойство зарегистрировано как присоединенное и отсутствует преднамеренная граница, блокирующая наследование (например, Frame).

См. также