Herança do valor da propriedade

A herança de valor de propriedade é um recurso do sistema de propriedades do Windows Presentation Foundation (WPF). 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. 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. 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.

A herança do valor da propriedade é uma herança de confinamento

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. Esse significado de herança também está ativo no WPF: as propriedades definidas em várias classes base são expostas como atributos para classes XAML derivadas quando usadas como elementos e expostas como membros para código. 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. Essa árvore de elementos é mais diretamente visível ao aninhar elementos dentro de outros elementos à medida que você define aplicativos na marcação XAML. Á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.

Aplicativos práticos de herança do valor da propriedade

As APIs do WPF incluem várias propriedades que têm a herança de propriedade habilitada. 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. Por exemplo, a propriedade controla FlowDirection qual direção o conteúdo fluído deve ser apresentado e organizado na página. Geralmente, você deseja que o conceito de fluxo de texto seja manipulado consistentemente em todos os elementos filho. 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. 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 engloba as necessidades de apresentação de cada página no aplicativo. Até mesmo o valor padrão inicial herdará dessa forma. 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.

Tornando uma propriedade personalizada herdável

Alterando os metadados de uma propriedade personalizada, você também pode tornar suas próprias propriedades personalizadas herdáveis. Observe, entretanto, que designar uma propriedade como herdável leva a algumas considerações de desempenho. 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.

Para fazer uma propriedade participar da herança de valor, crie uma propriedade anexada personalizada, conforme descrito em Registrar uma propriedade anexada. Registre a propriedade com metadados (FrameworkPropertyMetadata) e especifique a opção "Herdados" nas configurações de opções dentro desses metadados. Verifique também se a propriedade tem um valor padrão estabelecido, porque esse valor será herdado. 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". Depois de fazer isso, a propriedade hereditária 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 DependencyObjectarquivo .

As propriedades anexadas são conceitualmente semelhantes às propriedades globais; Você pode verificar o valor em qualquer um DependencyObject e obter um resultado válido. O cenário típico para propriedades anexadas é definir valores de propriedade em elementos filho, e esse cenário será mais eficaz se a propriedade em questão for uma propriedade anexada que esteja sempre implicitamente presente como uma propriedade anexada em cada elemento (DependencyObject) na árvore.

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. Sempre use RegisterAttached para registrar propriedades onde você especificar Inherits nos metadados.

Herdando valores de propriedade entre limites de árvores

A herança de propriedade funciona percorrendo uma árvore de elementos. Esta árvore geralmente é paralela à árvore lógica. No entanto, sempre que você incluir um objeto de nível de núcleo WPF na marcação que define uma árvore de elementos, como um Brush, você criou uma árvore lógica descontínua. Uma árvore lógica verdadeira não se estende conceitualmente através do Brush, porque a árvore lógica é um conceito de nível de estrutura WPF. Você pode ver isso refletido nos resultados ao usar os métodos do 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 hereditária tenha sido registrada como uma propriedade anexada e nenhum limite de bloqueio de herança deliberado (como um Frame) seja encontrado.

Confira também