Herança do valor da propriedade
A herança de valores de propriedade é uma funcionalidade do sistema de propriedades do Windows Presentation Foundation (WPF). A herança de valor de propriedade permite que elementos filhos numa árvore de elementos obtenham o valor de uma propriedade específica a partir dos elementos pais, herdando esse valor tal como foi definido no 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 recorre até a raiz da página. A herança do valor da propriedade não é o comportamento padrão do sistema de gestão de propriedades; uma propriedade deve ser configurada com metadados específicos para que essa propriedade inicie a herança do valor da propriedade nos elementos-filho.
Valor da propriedade Herança é herança de contenção
"Herança" como termo aqui não corresponde exatamente ao mesmo conceito de herança no contexto de tipos e programação orientada a objetos em geral, onde classes derivadas herdam definições dos membros das suas classes base. Esse significado de herança também está ativo no WPF: 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 de valor de propriedade refere-se especialmente a como os valores de propriedade podem ser herdados de um elemento para outro com base nas relações pai-filho numa árvore de elementos. Essa árvore de elementos é mais diretamente visível ao aninhar elementos dentro de outros elementos enquanto se define aplicações na notação XAML. Árvores de objetos também podem ser criadas programaticamente ao adicionar objetos a coleções designadas de outros objetos, e a herança de valor de propriedade funciona da mesma maneira na árvore finalizada durante a execução.
Aplicações Práticas da Transmissão do Valor Imobiliário
As APIs do WPF incluem várias propriedades que têm a herança de propriedade habilitada. Normalmente, o cenário para estes é que envolvem uma propriedade em que é apropriado que a propriedade seja definida apenas uma vez por página, mas em que essa propriedade também seja um membro de uma das classes de elemento base e, portanto, também existiria na maioria dos elementos filhos. Por exemplo, a propriedade FlowDirection controla em que direção o conteúdo fluído deve ser apresentado e organizado na página. Normalmente, é desejável que o conceito de fluxo de texto seja gerido de forma consistente em todos os elementos filho. Se a direção do fluxo foi, por algum motivo, redefinida em algum nível da árvore de elementos por ação do usuário ou do ambiente, ela normalmente deve ser redefinida por toda parte. Quando a propriedade FlowDirection é 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 será herdado dessa forma. O modelo de herança de valor de propriedade ainda permite que elementos individuais redefinam o valor para os raros casos em que ter uma mistura de direções de fluxo é intencional.
Tornando uma propriedade personalizada passível de herança
Ao alterar os metadados de uma propriedade personalizada, você também pode tornar suas próprias propriedades personalizadas herdáveis. Note-se, no entanto, que designar uma propriedade como hereditária tem algumas considerações de desempenho. Nos casos em que essa propriedade não tem um valor local estabelecido ou um valor obtido por meio de estilos, modelos ou associação de dados, uma propriedade hereditária fornece seus valores de propriedade atribuídos a todos os elementos filho na árvore lógica.
Para fazer com que uma propriedade participe da herança de valor, crie uma propriedade anexada personalizada, conforme descrito em Registrar uma propriedade anexada. Registe a propriedade com metadados (FrameworkPropertyMetadata) e especifique a opção "Herdar" nas opções dentro desses metadados. Certifique-se também de que a propriedade tem um valor padrão estabelecido, porque esse valor agora será herdado. Embora tenha registado a propriedade como anexa, poderá também querer criar um "wrapper" de propriedade para obter/definir acesso no tipo de proprietário, tal como faria para uma propriedade de dependência não anexa. Depois de fazer isso, a propriedade hereditária pode ser definida usando o invólucro de propriedade direta no tipo proprietário ou em tipos derivados, ou pode ser definida usando a sintaxe de propriedade anexada num qualquer 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. 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 for uma propriedade anexada que está sempre implicitamente presente como uma propriedade anexada em cada elemento (DependencyObject) na árvore.
Observação
Embora a herança de valor para propriedades de dependência não anexadas possa parecer funcionar, o comportamento de herança de uma propriedade não anexada através de certos limites de elementos na árvore de execução em tempo real é indefinido. Sempre use RegisterAttached para registrar propriedades nas quais você especifica Inherits nos metadados.
Herdando valores de propriedade através dos limites da árvore
A herança de propriedades funciona ao atravessar uma árvore de elementos. Esta árvore é muitas vezes paralela à árvore lógica. No entanto, sempre que incluir um objeto do nível central do WPF na marcação que define uma árvore de elementos, como um Brush, terá criado uma árvore lógica descontínua. Uma verdadeira árvore lógica não se estende conceitualmente pelo Brush, porque a árvore lógica é um conceito ao nível do framework WPF. Você pode ver isso refletido nos resultados ao usar os métodos de 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 propriedade anexada e nenhum limite deliberado de bloqueio de herança (como um Frame) seja encontrado.
Ver também
.NET Desktop feedback