Herança do valor de propriedadeProperty Value Inheritance

A herança do valor da propriedade é um recurso do sistema de propriedade 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. A herança do valor da propriedade permite que elementos filho em uma árvore de elementos obtenham o valor de uma propriedade específica dos elementos pai, herdando esse valor como ele foi definido em qualquer lugar do elemento pai mais próximo.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. O elemento pai também pode ter obtido seu valor por meio da herança do valor da propriedade, de modo que o sistema potencialmente é recursivo até a raiz da 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. A herança do valor da propriedade não é o comportamento padrão do sistema de propriedade; uma propriedade deve ser estabelecida com uma configuração específica de metadados para fazer com que essa propriedade inicie a herança do valor da propriedade nos elementos filho.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.

A herança do valor da propriedade é uma herança de confinamentoProperty Value Inheritance Is Containment Inheritance

O termo "herança" aqui não tem exatamente o mesmo conceito de herança no contexto de tipos e da programação voltada a objetos de modo geral, em que as classes derivadas herdam definições de membro de suas classes 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. O significado de herança também é ativo em WPFWPF: propriedades definidas em várias classes base são expostas como atributos para classes XAMLXAML derivadas quando usadas como elementos, e são expostas como membros ao 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. A herança do valor da propriedade está relacionada, especificamente, a como valores da propriedade podem ser herdados de um elemento para outro com base nas relações pai e filho dentro de uma árvore 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. A árvore de elementos fica visível mais diretamente quando aninha elementos dentro de outros elementos conforme você define aplicativos na marcação de XAMLXAML.That tree of elements is most directly visible when nesting elements inside other elements as you define applications in XAMLXAML markup. Árvores de objetos também podem ser criadas programaticamente adicionando objetos a coleções designadas de outros objetos, e a herança do valor da propriedade funciona da mesma maneira na árvore terminada em tempo de execução.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.

Aplicativos práticos de herança do valor da propriedadePractical Applications of Property Value Inheritance

As WPFWPF APIs incluem várias propriedades que têm herança de Propriedade habilitada.The WPFWPF APIs include several properties that have property inheritance enabled. Normalmente, o cenário é que eles envolvem uma propriedade em que é adequado que a propriedade seja definida apenas uma vez por página, mas em que essa propriedade também é membro de uma das classes de elementos base e, portanto, também existiria na maioria dos elementos filho.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 exemplo, a FlowDirection propriedade controla em qual direção o conteúdo fluido deve ser apresentado e organizado na página.For example, the FlowDirection property controls which direction flowed content should be presented and arranged on the page. Geralmente, você deseja que o conceito de fluxo de texto seja manipulado consistentemente em todos os elementos filho.Typically, you want the text flow concept to be handled consistently throughout all child elements. Se a direção do fluxo fosse, por algum motivo, redefinida em algum nível da árvore de elementos por uma ação do usuário ou do ambiente, ela normalmente seria redefinida em todos os casos.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. Quando a FlowDirection propriedade é feita para herdar, o valor só precisa ser definido ou redefinido uma vez no nível na árvore de elementos que abrange as necessidades de apresentação de cada página no aplicativo.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. Até mesmo o valor padrão inicial herdará dessa forma.Even the initial default value will inherit in this way. O modelo de herança do valor da propriedade ainda permite que elementos individuais redefinam o valor para os raros casos em que ter uma combinação de direções de fluxo é intencional.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.

Tornando uma propriedade personalizada herdávelMaking a Custom Property Inheritable

Alterando os metadados de uma propriedade personalizada, você também pode tornar suas próprias propriedades personalizadas herdáveis.By changing a custom property's metadata, you can also make your own custom properties inheritable. Observe, entretanto, que designar uma propriedade como herdável leva a algumas considerações de desempenho.Note, however, that designating a property as inheritable does have some performance considerations. Em casos em que a propriedade não tem um valor local estabelecido, ou um valor obtido através de estilos, modelos ou associação de dados, uma propriedade herdável fornece seus valores de propriedade atribuídos a todos os elementos filho na árvore lógica.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 fazer uma propriedade participar da herança de valor, crie uma propriedade anexada personalizada, conforme descrito em Registrar uma propriedade anexada.To make a property participate in value inheritance, create a custom attached property, as described in Register an Attached Property. Registre a propriedade com metadados (FrameworkPropertyMetadata) e especifique a opção "Inherits" nas configurações de opções dentro desses metadados.Register the property with metadata (FrameworkPropertyMetadata) and specify the "Inherits" option in the options settings within that metadata. Verifique também se a propriedade tem um valor padrão estabelecido, porque esse valor será herdado.Also make sure that the property has an established default value, because that value will now inherit. Embora você tenha registrado a propriedade como anexada, também convém criar um "wrapper" da propriedade para o acesso de obter/definir no tipo do proprietário, exatamente como você faria para uma propriedade de dependência "não anexada".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. Depois de fazer isso, a propriedade herdável pode ser definida usando o wrapper de propriedade direta no tipo de proprietário ou tipos derivados, ou pode ser definida usando a sintaxe de propriedade anexada em qualquer 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.

As propriedades anexadas são conceitualmente semelhantes às propriedades globais; Você pode verificar o valor em qualquer DependencyObject e obter um 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. O cenário típico para propriedades anexadas é definir valores de propriedade em elementos filho e esse cenário é mais eficaz se a propriedade em questão é uma propriedade anexada que está sempre presente implicitamente como uma propriedade anexada em cada elemento (DependencyObject) na árvore.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.

Observação

Embora a herança do valor da propriedade possa parecer funcionar para propriedades de dependência não anexadas, o comportamento da herança de uma propriedade não anexada em certos limites de elemento na árvore de tempo de execução é 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. Sempre use RegisterAttached para registrar Propriedades em que você Inherits especificar nos metadados.Always use RegisterAttached to register properties where you specify Inherits in the metadata.

Herdando valores de propriedade entre limites de árvoresInheriting Property Values Across Tree Boundaries

A herança de propriedade funciona percorrendo uma árvore de elementos.Property inheritance works by traversing a tree of elements. Esta árvore geralmente é paralela à árvore lógica.This tree is often parallel to the logical tree. No entanto, sempre que você incluir um objeto de nível básico do WPF na marcação que define uma árvore de elementos Brush, como um, você criou uma árvore lógica descontínua.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. Uma verdadeira árvore lógica não se estende conceitualmente pelo Brush, porque a árvore lógica é um conceito de nível de estrutura do WPF.A true logical tree does not conceptually extend through the Brush, because the logical tree is a WPF framework-level concept. Você pode ver isso refletido nos resultados ao usar os métodos de LogicalTreeHelper.You can see this reflected in the results when using the methods of LogicalTreeHelper. No entanto, a herança de valor de propriedade pode preencher essa lacuna na árvore lógica e ainda pode passar valores herdados, desde que a propriedade herdável tenha sido registrada como uma propriedade anexada e nenhum limite de bloqueio de herança deliberado (como um Frame) é encontrado.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.

Consulte tambémSee also