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

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

В этом разделе содержатся следующие подразделы.

  • Наследование значения свойства является вложенным наследованием
  • Практическое применение наследования значения свойства
  • Создание настраиваемого наследования свойства
  • Наследование значений свойства за границами дерева
  • Связанные разделы

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

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

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

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

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

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

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

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

ПримечаниеПримечание

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

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

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

См. также

Основные понятия

Метаданные свойства зависимости

Общие сведения о вложенных свойствах зависимостей

Приоритет значения свойств зависимостей