Наследование значения свойства
Наследование значения свойства — это функция системы свойств Windows Presentation Foundation (WPF). Наследование значения свойства позволяет дочерним элементам в дереве элементов получать значение конкретного свойства из родительских элементов, наследуя это значение, настроенное в ближайшем родительском элементе. Родительский элемент также мог получить свое значение через наследование значения свойства, поэтому система потенциально рекурсивно проходит по элементам к корню страницы. Наследование значения свойства не является стандартным поведением системы свойств. Чтобы свойство инициировало наследование значения свойства для дочерних элементов, оно должно быть установлено с определенным параметром метаданных.
Наследование значения свойства является наследованием вложений
Используемый здесь термин "наследование" отличается от концепции наследования в контексте типов и общего объектно-ориентированного программирования, где производные классы наследуют определения членов от своих базовых классов. Это значение наследования также активно в WPF: свойства, определенные в различных базовых классах, отображаются как атрибуты для производных классов XAML при использовании в качестве элементов и представляются для кода как члены. В частности, наследование значения свойства заключается в том, как значения свойств могут наследоваться от одного элемента к другому на основе иерархических отношений в дереве элементов. Это дерево элементов наиболее явно видно при встраивании элементов в другие элементы во время определения приложения в разметке XAML. Деревья объектов также могут создаваться программно путем добавления объектов к выделенным коллекциям других объектов, а наследование значения свойства работает аналогично в конечном дереве во время выполнения.
Практическое применение наследования значения свойства
WPF API включают несколько свойств, в которых включено наследование свойства. Как правило, сценарий для них состоит во включении свойства там, где уместно устанавливать свойство только один раз на странице, но это свойство также является членом одного из базовых классов элементов и, таким образом, может существовать в большинстве дочерних элементов. Например FlowDirection свойства элементов управления, переданное содержимое которых следует представлен и организован на странице. Как правило, требуется, чтобы концепция направления текста согласованно обрабатывалась во всех дочерних элементах. Если направление передачи по какой-то причине было прервано на некотором уровне дерева элементов в результате действия пользователя или среды, то оно должно быть перезапущено повсюду. Когда FlowDirection свойство для наследования, то значение нужно только задать или сбросить один раз на уровне в дереве элементов, который охватывает требования каждой страницы в приложении. Таким образом будет наследоваться даже начальное значение по умолчанию. Модель наследования значений свойств также позволяет отдельным элементам сбрасывать значение в тех редких случаях, когда сочетание направлений текста является преднамеренным.
Создание настраиваемого наследуемого свойства
Изменяя метаданные настраиваемого свойства, можно создать собственные наследуемые свойства. Обратите внимание, что назначение свойства как наследуемого оказывает определенное влияние на производительность. В случаях, когда это свойство не имеет установленного локального значения или значения, полученного через стили, шаблоны или привязки данных, наследуемое свойство предоставляет присвоенные ему значения всем дочерним элементам в логическом дереве.
Чтобы свойство участвовало в наследовании значения, создайте настраиваемое присоединенное свойство, как описано в разделе Регистрация присоединенного свойства. Зарегистрируйте свойство с метаданными (FrameworkPropertyMetadata) и укажите параметр «Наследует» в настройках параметров в этих метаданных. Также убедитесь, что для свойства задано значение по умолчанию, так как теперь это значение будет наследоваться. Несмотря на регистрацию свойства как присоединенного, можно создать "оболочку" свойства для получения/настройки доступа к типу владельца точно так же, как и для "неприсоединенного" свойства зависимостей. После этого наследуемое свойство может быть установлено либо с помощью оболочки прямой свойства для типа владельца или производного типа, или его можно установить с помощью синтаксиса присоединенного свойства для какого-либо DependencyObject.
Присоединенные свойства похожи на глобальные свойства; можно проверить значение любого DependencyObject и получить правильный результат. Типичный сценарий для присоединенных свойств является установка значений свойств для дочерних элементов, и этот скрипт будет более эффективен, если рассматриваемое свойство является присоединенным свойством, всегда неявно присутствует в качестве присоединенного свойства для каждого элемента (DependencyObject) в дереве.
Note
Несмотря на то что наследование значения свойства может выполняться для неприсоединенных свойств зависимостей, поведение наследования для таких свойств через определенные границы элементов в дереве среды выполнения не определено. Всегда используйте RegisterAttached для регистрации вы зададите свойства Inherits в метаданных.
Наследование значений свойств за границами дерева
Наследование свойств работает путем обхода дерева элементов. Это дерево часто параллельно логическому дереву. Тем не менее, при включении объекта уровня ядра WPF в разметку, определяющую дерево элементов, таких как Brush, вы создали несплошное логическое дерево. Истинное логическое дерево концептуально не расширяется через Brush, так как логическое дерево является концепцией уровня среды WPF. Вы можете увидеть это отражается в результатах, при использовании методов класса LogicalTreeHelper. Тем не менее наследование значения свойства может устранить этот разрыв в логическом дереве и можно по-прежнему передавать унаследованные значения, до тех пор, пока наследуемое свойство зарегистрировано как присоединенное свойство, а не намеренным граница, блокирующая наследование (например Frame) обнаруживается.