Herencia de valores de propiedadProperty Value Inheritance

La herencia de valores de propiedad es una característica del sistema de propiedades de 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. La herencia de valores de propiedad permite que los elementos secundarios de un árbol de elementos obtengan el valor de una propiedad determinada de los elementos principales y que hereden ese valor tal como se estableció en cualquier otro lugar del elemento principal más cercano.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. Es posible que el elemento principal también haya obtenido su valor a través de la herencia de valores de propiedad, por lo que el sistema se repite potencialmente hasta la raíz de la página.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. La herencia de valores de propiedad no es el comportamiento del sistema de propiedades predeterminado: es necesario establecer una propiedad con un valor de metadatos concreto para que inicie la herencia de valores de propiedad en elementos secundarios.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.

La herencia de valores de propiedad es la herencia de contenciónProperty Value Inheritance Is Containment Inheritance

"Herencia" como término aquí no es exactamente el mismo concepto que la herencia en el contexto de programación orientada a objetos generales y tipos, donde las clases derivadas heredan las definiciones de miembros de sus clases base."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. Ese significado de herencia también está activo en WPFWPF: las propiedades definidas en varias clases base se exponen como atributos para clases XAMLXAML derivadas cuando se usan como elementos y se exponen como miembros para código.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. La herencia de valores de propiedad trata especialmente acerca de cómo los valores de propiedad se pueden heredar de un elemento a otro basándose en las relaciones entre elementos primarios y secundarios de un árbol de elementos.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. Este árbol de elementos es visible directamente al anidar elementos dentro de otros elementos cuando se definen aplicaciones en el marcado XAMLXAML.That tree of elements is most directly visible when nesting elements inside other elements as you define applications in XAMLXAML markup. Los árboles de objetos también pueden crearse mediante programación si se agregan objetos a colecciones designadas de otros objetos. La herencia de valores de propiedad funciona del mismo modo en el árbol terminado en tiempo de ejecución.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.

Aplicaciones prácticas de la herencia de valores de propiedadPractical Applications of Property Value Inheritance

Las APIAPIs de WPFWPF incluyen varias propiedades que tienen habilitada la herencia de propiedad.The WPFWPF APIAPIs include several properties that have property inheritance enabled. Normalmente, el escenario en estos casos es que implican una propiedad donde es apropiado que se establezca la propiedad una sola vez por página, pero donde esa propiedad también es un miembro de una de las clases de elementos base y, por tanto, también existirá en la mayoría de los elementos secundarios.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. Por ejemplo, el FlowDirection propiedad controla qué dirección fluye el contenido debe aparecer y se organizan en la página.For example, the FlowDirection property controls which direction flowed content should be presented and arranged on the page. Normalmente, quiere que el concepto de flujo de texto se controle de forma coherente en todos los elementos secundarios.Typically, you want the text flow concept to be handled consistently throughout all child elements. Si el usuario o una acción del entorno restableciera la dirección de flujo por alguna razón en algún nivel del árbol de elementos, normalmente, debería restablecerse en todo el árbol.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. Cuando el FlowDirection propiedad se realiza para heredar, el valor sólo se debe establecer o restablecer una vez en el nivel del árbol de elementos que abarque las necesidades de presentación de cada página de la aplicación.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. Incluso el valor predeterminado inicial se heredará de esta manera.Even the initial default value will inherit in this way. El modelo de herencia de valor de propiedad aún permite que elementos individuales restablezcan el valor para los pocos casos en los que tener una combinación de direcciones de flujo es deliberado.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.

Hacer heredable una propiedad personalizadaMaking a Custom Property Inheritable

Al cambiar los metadatos de una propiedad personalizada, también puede hacer que sus propias propiedades personalizadas sean heredables.By changing a custom property's metadata, you can also make your own custom properties inheritable. Sin embargo, tenga en cuenta que designar una propiedad como heredable tiene algunas consideraciones de rendimiento.Note, however, that designating a property as inheritable does have some performance considerations. En casos donde esa propiedad no tiene ningún valor local establecido o ningún valor obtenido a través de estilos, plantillas o enlaces de datos, una propiedad heredable proporciona sus valores de propiedad asignados a todos los elementos secundarios del árbol lógico.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.

Para que una propiedad participe en la herencia de valores, cree una propiedad asociada personalizada, tal como se describe en Registrar una propiedad asociada.To make a property participate in value inheritance, create a custom attached property, as described in Register an Attached Property. Registrar la propiedad con metadatos (FrameworkPropertyMetadata) y especifique la opción "Inherits" en la configuración de opciones dentro de los metadatos.Register the property with metadata (FrameworkPropertyMetadata) and specify the "Inherits" option in the options settings within that metadata. Asegúrese también de que la propiedad tenga un valor predeterminado establecido, porque ahora se heredará ese valor.Also make sure that the property has an established default value, because that value will now inherit. Aunque registró la propiedad como asociada, es posible que también quiera crear una propiedad "wrapper" para obtener o establecer acceso al tipo de propietario, del mismo modo que para una propiedad de dependencia "nonattached".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. Una vez hecho esto, la propiedad heredable puede establecerse mediante el contenedor de propiedad directa en el tipo de propietario o los tipos derivados, o se puede establecer utilizando la sintaxis de la propiedad adjunta en cualquier 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.

Las propiedades asociadas son conceptualmente similares a las propiedades globales; puede comprobar el valor en cualquier DependencyObject y obtener un resultado válido.Attached properties are conceptually similar to global properties; you can check for the value on any DependencyObject and get a valid result. El escenario típico para las propiedades asociadas consiste en establecer valores de propiedad en elementos secundarios, y ese escenario es más eficaz si la propiedad en cuestión es una propiedad adjunta que siempre está presente implícitamente como una propiedad adjunta en cada elemento (DependencyObject) en el árbol.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.

Nota

Aunque puede parecer que la herencia de valores de propiedad funciona para las propiedades de dependencia que no son asociadas, el comportamiento de la herencia para una propiedad no asociada a través de algunos límites de elementos en el árbol de tiempo de ejecución es indefinido.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. Utilice siempre RegisterAttached para registrar las propiedades donde especifique Inherits en los metadatos.Always use RegisterAttached to register properties where you specify Inherits in the metadata.

Heredar valores de propiedad entre límites de árbolInheriting Property Values Across Tree Boundaries

La herencia de propiedades funciona al recorrer un árbol de elementos.Property inheritance works by traversing a tree of elements. Este árbol suele ser paralelo al árbol lógico.This tree is often parallel to the logical tree. Sin embargo, cada vez que incluye un objeto de nivel de núcleo WPF en el marcado que define un árbol de elementos, como un Brush, ha creado un árbol lógico discontinuo.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. Un verdadero árbol lógico no se extiende conceptualmente a través de la Brush, ya que el árbol lógico es un concepto de nivel de marco WPF.A true logical tree does not conceptually extend through the Brush, because the logical tree is a WPF framework-level concept. Puede ver esto reflejado en los resultados al usar los métodos de LogicalTreeHelper.You can see this reflected in the results when using the methods of LogicalTreeHelper. Sin embargo, la herencia de valores de propiedad puede cerrar esta brecha en el árbol lógico y todavía se puede pasar valores heredados, siempre y cuando la propiedad heredable se registrara como una propiedad adjunta y ningún límite de bloqueo de herencia deliberado (como un Frame) se encuentra.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.

Vea tambiénSee also