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

Наследование значения свойства — это функция системы свойств Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF).Property value inheritance is a feature of the Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) property system. Наследование значения свойства позволяет дочерним элементам в дереве элементов получать значение конкретного свойства из родительских элементов, наследуя это значение, настроенное в ближайшем родительском элементе.Property value inheritance enables child elements in a tree of elements to obtain the value of a particular property from parent elements, inheriting that value as it was set anywhere in the nearest parent element. Родительский элемент также мог получить свое значение через наследование значения свойства, поэтому система потенциально рекурсивно проходит по элементам к корню страницы.The parent element might also have obtained its value through property value inheritance, so the system potentially recurses all the way to the page root. Наследование значения свойства не является стандартным поведением системы свойств. Чтобы свойство инициировало наследование значения свойства для дочерних элементов, оно должно быть установлено с определенным параметром метаданных.Property value inheritance is not the default property system behavior; a property must be established with a particular metadata setting in order to cause that property to initiate property value inheritance on child elements.

Наследование значения свойства является наследованием вложенийProperty Value Inheritance Is Containment Inheritance

Используемый здесь термин "наследование" отличается от концепции наследования в контексте типов и общего объектно-ориентированного программирования, где производные классы наследуют определения членов от своих базовых классов."Inheritance" as a term here is not quite the same concept as inheritance in the context of types and general object-oriented programming, where derived classes inherit member definitions from their base classes. Это значение наследования также активно в WPFWPF: свойства, определенные в различных базовых классах, отображаются как атрибуты для производных классов XAMLXAML при использовании в качестве элементов и представляются для кода как члены.That meaning of inheritance is also active in WPFWPF: properties defined in various base classes are exposed as attributes for derived XAMLXAML classes when used as elements, and exposed as members for code. В частности, наследование значения свойства заключается в том, как значения свойств могут наследоваться от одного элемента к другому на основе иерархических отношений в дереве элементов.Property value inheritance is particularly about how property values can inherit from one element to another on the basis of the parent-child relationships within a tree of elements. Это дерево элементов наиболее явно видно при встраивании элементов в другие элементы во время определения приложения в разметке XAMLXAML.That tree of elements is most directly visible when nesting elements inside other elements as you define applications in XAMLXAML markup. Деревья объектов также могут создаваться программно путем добавления объектов к выделенным коллекциям других объектов, а наследование значения свойства работает аналогично в конечном дереве во время выполнения.Trees of objects can also be created programmatically by adding objects to designated collections of other objects, and property value inheritance works the same way in the finished tree at run time.

Практическое применение наследования значения свойстваPractical Applications of Property Value Inheritance

WPFWPF API-интерфейсы включают несколько свойств, для которых включено наследование свойств.The WPFWPF APIs include several properties that have property inheritance enabled. Как правило, сценарий для них состоит во включении свойства там, где уместно устанавливать свойство только один раз на странице, но это свойство также является членом одного из базовых классов элементов и, таким образом, может существовать в большинстве дочерних элементов.Typically, the scenario for these is that they involve a property where it is appropriate that the property be set only once per page, but where that property is also a member of one of the base element classes and thus would also exist on most of the child elements. Например, элементы управления FlowDirection , которые направлены на направление содержимого, должны быть представлены и упорядочены на странице.For example, the FlowDirection property controls which direction flowed content should be presented and arranged on the page. Как правило, требуется, чтобы концепция направления текста согласованно обрабатывалась во всех дочерних элементах.Typically, you want the text flow concept to be handled consistently throughout all child elements. Если направление передачи по какой-то причине было прервано на некотором уровне дерева элементов в результате действия пользователя или среды, то оно должно быть перезапущено повсюду.If flow direction were for some reason reset in some level of the element tree by user or environment action, it should typically be reset throughout. FlowDirection Когда свойство наследуется, оно должно быть установлено или сброшено только один раз на уровне в дереве элементов, охватывающем потребности представления каждой страницы в приложении.When the FlowDirection property is made to inherit, the value need only be set or reset once at the level in the element tree that encompasses the presentation needs of each page in the application. Таким образом будет наследоваться даже начальное значение по умолчанию.Even the initial default value will inherit in this way. Модель наследования значений свойств также позволяет отдельным элементам сбрасывать значение в тех редких случаях, когда сочетание направлений текста является преднамеренным.The property value inheritance model still enables individual elements to reset the value for the rare cases where having a mix of flow directions is intentional.

Создание настраиваемого наследуемого свойстваMaking a Custom Property Inheritable

Изменяя метаданные настраиваемого свойства, можно создать собственные наследуемые свойства.By changing a custom property's metadata, you can also make your own custom properties inheritable. Обратите внимание, что назначение свойства как наследуемого оказывает определенное влияние на производительность.Note, however, that designating a property as inheritable does have some performance considerations. В случаях, когда это свойство не имеет установленного локального значения или значения, полученного через стили, шаблоны или привязки данных, наследуемое свойство предоставляет присвоенные ему значения всем дочерним элементам в логическом дереве.In cases where that property does not have an established local value, or a value obtained through styles, templates, or data binding, an inheritable property provides its assigned property values to all child elements in the logical tree.

Чтобы свойство участвовало в наследовании значения, создайте настраиваемое присоединенное свойство, как описано в разделе Регистрация присоединенного свойства.To make a property participate in value inheritance, create a custom attached property, as described in Register an Attached Property. Зарегистрируйте свойство с помощью метаданныхFrameworkPropertyMetadata() и укажите параметр "Inherits" в параметрах параметров в этих метаданных.Register the property with metadata (FrameworkPropertyMetadata) and specify the "Inherits" option in the options settings within that metadata. Также убедитесь, что для свойства задано значение по умолчанию, так как теперь это значение будет наследоваться.Also make sure that the property has an established default value, because that value will now inherit. Несмотря на регистрацию свойства как присоединенного, можно создать "оболочку" свойства для получения/настройки доступа к типу владельца точно так же, как и для "неприсоединенного" свойства зависимостей.Although you registered the property as attached, you might also want to create a property "wrapper" for get/set access on the owner type, just as you would for an "nonattached" dependency property. После этого наследуемое свойство может быть установлено с помощью оболочки прямого свойства для типа владельца или производных типов или может быть задана с помощью синтаксиса присоединенного свойства для любого DependencyObject.After doing so, the inheritable property can either be set by using the direct property wrapper on the owner type or derived types, or it can be set by using the attached property syntax on any DependencyObject.

Присоединенные свойства концептуально похожи на глобальные свойства. можно проверить значение Any DependencyObject и получить допустимый результат.Attached properties are conceptually similar to global properties; you can check for the value on any DependencyObject and get a valid result. Типичным сценарием для присоединенных свойств является установка значений свойств для дочерних элементов, и этот сценарий более эффективен, если рассматриваемое свойство является вложенным свойством, которое всегда неявно представляется как присоединенное свойство для каждого элемента (DependencyObject) в дереве.The typical scenario for attached properties is to set property values on child elements, and that scenario is more effective if the property in question is an attached property that is always implicitly present as an attached property on each element (DependencyObject) in the tree.

Примечание

Несмотря на то что наследование значения свойства может выполняться для неприсоединенных свойств зависимостей, поведение наследования для таких свойств через определенные границы элементов в дереве среды выполнения не определено.Although property value inheritance might appear to work for nonattached dependency properties, the inheritance behavior for a nonattached property through certain element boundaries in the run-time tree is undefined. Всегда используйте RegisterAttached для регистрации свойств, в которых Inherits указывается в метаданных.Always use RegisterAttached to register properties where you specify Inherits in the metadata.

Наследование значений свойств за границами дереваInheriting Property Values Across Tree Boundaries

Наследование свойств работает путем обхода дерева элементов.Property inheritance works by traversing a tree of elements. Это дерево часто параллельно логическому дереву.This tree is often parallel to the logical tree. Однако при включении объекта уровня ядра WPF в разметку, определяющую дерево элементов, например Brush, вы создали неразрывное логическое дерево.However, whenever you include a WPF core-level object in the markup that defines an element tree, such as a Brush, you have created a discontinuous logical tree. Истинное логическое дерево по сути не расширяется с помощью Brush, поскольку логическое дерево является концепцией уровня среды WPF.A true logical tree does not conceptually extend through the Brush, because the logical tree is a WPF framework-level concept. Это отображается в результатах при использовании методов LogicalTreeHelper.You can see this reflected in the results when using the methods of LogicalTreeHelper. Однако наследование значения свойства может преодолеть этот зазор в логическом дереве и по-прежнему может передавать унаследованные значения с помощью, пока свойство, которое наследуется, было зарегистрировано как присоединенное свойство и не имеет намеренной границы блокировки наследования (например, Frame).However, property value inheritance can bridge this gap in the logical tree and can still pass inherited values through, so long as the inheritable property was registered as an attached property and no deliberate inheritance-blocking boundary (such as a Frame) is encountered.

См. такжеSee also