Metadados de Propriedade do Framework
As opções de metadados de propriedade do framework são relatadas para as propriedades de elementos de objeto considerados ao nível do framework WPF na arquitetura do Windows Presentation Foundation (WPF). Em geral, a designação de nível de estrutura do WPF implica que recursos como renderização, vinculação de dados e refinamentos do sistema de propriedade sejam manipulados pelas APIs e executáveis de apresentação do WPF. Os metadados de propriedades da estrutura são consultados por esses sistemas para determinar características específicas de propriedades de elementos individuais.
Pré-requisitos
Este tópico pressupõe que você compreenda as propriedades de dependência da perspetiva de um consumidor de propriedades de dependência existentes em classes do Windows Presentation Foundation (WPF) e tenha lido o Dependency Properties Overview. Você também deve ter lido os Metadados de Propriedade de Dependência .
O que é comunicado pelos metadados de propriedade do Framework
Os metadados da propriedade Framework podem ser divididos nas seguintes categorias:
Propriedades de layout de relatório que afetam um elemento (AffectsArrange, AffectsMeasure, AffectsRender). Você pode definir esses sinalizadores em metadados se a propriedade afetar esses respetivos aspetos e também estiver implementando os métodos MeasureOverride / ArrangeOverride em sua classe para fornecer informações e comportamento de renderização específicos para o sistema de layout. Normalmente, essa implementação verificaria se há invalidações de propriedade em propriedades de dependência em que qualquer uma dessas propriedades de layout fosse verdadeira nos metadados de propriedade, e somente essas invalidações exigiriam a solicitação de uma nova passagem de layout.
Propriedades de layout de relatório que afetam o elemento pai de um elemento (AffectsParentArrange, AffectsParentMeasure). Alguns exemplos em que esses sinalizadores são definidos por padrão são FixedPage.Left e Paragraph.KeepWithNext.
Inherits. Por padrão, as propriedades de dependência não herdam valores. OverridesInheritanceBehavior permite que o caminho da herança também se estenda até uma árvore visual, o que é necessário para alguns cenários de composição de controlos.
Observação
O termo "herda" no contexto de valores de propriedade significa algo específico para propriedades de dependência; isso significa que os elementos filho podem herdar o valor real da propriedade de dependência dos elementos pai devido a uma capacidade de nível de estrutura WPF do sistema de propriedades WPF. Não tem nada a ver diretamente com o tipo de código gerido nem com a herança de membros através de tipos derivados. Para obter detalhes, consulte Herança de valor de propriedade.
Relatar características de vinculação de dados (IsNotDataBindable, BindsTwoWayByDefault). Por padrão, as propriedades de dependência na estrutura oferecem suporte à vinculação de dados, com um comportamento de vinculação unidirecional. Você pode desabilitar a vinculação de dados se não houver nenhum cenário para isso (porque eles se destinam a ser flexíveis e extensíveis, não há muitos exemplos de tais propriedades nas APIs WPF padrão). Você pode definir a associação para ter um padrão bidirecional para propriedades que vinculam os comportamentos de um controle entre suas partes componentes (IsSubmenuOpen é um exemplo) ou onde a associação bidirecional é o cenário comum e esperado para os usuários (Text é um exemplo). Alterar os metadados relacionados à associação de dados influencia apenas a predefinição; de forma individual, essa predefinição pode sempre ser alterada. Para obter detalhes sobre os modos de vinculação e a vinculação em geral, consulte Visão geral da vinculação de dados .
Relatando se as propriedades devem ser registradas no diário por aplicativos ou serviços que oferecem suporte ao registro no diário (Journal). Para elementos gerais, o registro no diário não é habilitado por padrão, mas é habilitado seletivamente para determinados controles de entrada do usuário. Essa propriedade destina-se a ser lida por serviços de registro no diário, incluindo a implementação WPF de registro no diário, e normalmente é definida em controles de usuário, como seleções de usuários dentro de listas que devem ser persistidas nas etapas de navegação. Para obter informações sobre a revista, consulte Visão geral da navegação.
Lendo FrameworkPropertyMetadata
Cada uma das propriedades vinculadas acima são as propriedades específicas que o FrameworkPropertyMetadata adiciona à sua classe base imediata UIPropertyMetadata. Cada uma dessas propriedades será false
por padrão. Uma solicitação de metadados para uma propriedade em que conhecer o valor dessas propriedades é importante deve tentar converter os metadados retornados para FrameworkPropertyMetadatae, em seguida, verificar os valores das propriedades individuais conforme necessário.
Especificando metadados
Ao criar uma nova instância de metadados para fins de aplicação de metadados a um novo registro de propriedade de dependência, você tem a escolha de qual classe de metadados usar: o PropertyMetadata base ou alguma classe derivada, como FrameworkPropertyMetadata. Em geral, você deve usar FrameworkPropertyMetadata, especialmente se sua propriedade tiver alguma interação com o sistema de propriedades e funções WPF, como layout e vinculação de dados. Outra opção para cenários mais sofisticados é derivar de FrameworkPropertyMetadata para criar a sua própria classe de relatório de metadados que transportem informações adicionais nos seus membros. Ou você pode usar PropertyMetadata ou UIPropertyMetadata para comunicar o grau de suporte para recursos de sua implementação.
Para propriedades existentes (AddOwner ou chamada OverrideMetadata), você sempre deve substituir pelo tipo de metadados usado pelo registro original.
Se você estiver criando uma instância FrameworkPropertyMetadata, há duas maneiras de preencher esses metadados com valores para as propriedades específicas que comunicam as características da propriedade da estrutura:
Use a assinatura do construtor FrameworkPropertyMetadata que permite um parâmetro
flags
. Este parâmetro deve ser preenchido com todos os valores combinados desejados dos FrameworkPropertyMetadataOptions sinalizadores de enumeração.Use uma das assinaturas sem um parâmetro
flags
e, em seguida, defina cada propriedade booleana de relatório em FrameworkPropertyMetadata paratrue
para cada alteração de característica desejada. Se fizer isso, deve definir essas propriedades antes que quaisquer elementos com essa propriedade de dependência sejam construídos; as propriedades booleanas têm leitura e escrita para permitir esse comportamento de evitar o parâmetroflags
e ainda preencher os metadados, mas os metadados devem tornar-se efetivamente bloqueados antes do uso da propriedade. Assim, tentar definir as propriedades depois que os metadados forem solicitados será uma operação inválida.
Comportamento de mesclagem de metadados da propriedade Framework
Quando você substitui os metadados da propriedade da estrutura, as diferentes características dos metadados são mescladas ou substituídas.
PropertyChangedCallback é fundida. Se você adicionar um novo PropertyChangedCallback, esse retorno de chamada será armazenado nos metadados. Caso não especifique um PropertyChangedCallback na substituição, o valor de PropertyChangedCallback será promovido como referência do ancestral mais próximo que o especificou nos metadados.
O comportamento efetivo do sistema de propriedades para PropertyChangedCallback é que as implementações para todos os proprietários de metadados na hierarquia são mantidas e adicionadas a uma tabela, sendo que a ordem de execução do sistema de propriedades faz com que os retornos de chamada da classe mais profundamente derivada sejam invocados primeiro. Os retornos de chamada herdados são executados apenas uma vez, sendo considerados como pertencentes à classe que os inseriu nos metadados.
DefaultValue é substituído. Se você não especificar um PropertyChangedCallback na substituição, o valor de DefaultValue virá do ancestral mais próximo que o especificou nos metadados.
CoerceValueCallback implementações são substituídas. Se adicionar um novo CoerceValueCallback, esse callback será armazenado nos metadados. Se você não especificar um CoerceValueCallback na substituição, o valor de CoerceValueCallback será promovido como uma referência do ancestral mais próximo que o especificou nos metadados.
O comportamento do sistema de propriedades é que apenas o CoerceValueCallback nos metadados imediatos é invocado. Nenhuma referência a outras implementações de CoerceValueCallback na hierarquia é mantida.
As bandeiras da enumeração FrameworkPropertyMetadataOptions são combinadas como uma operação OR bit a bit. Se você especificar FrameworkPropertyMetadataOptions, as opções originais não serão substituídas. Para alterar uma opção, defina a propriedade correspondente em FrameworkPropertyMetadata. Por exemplo, se o objeto FrameworkPropertyMetadata original definir o sinalizador FrameworkPropertyMetadataOptions.NotDataBindable, você poderá alterá-lo definindo FrameworkPropertyMetadata.IsNotDataBindable como
false
.
Esse comportamento é implementado por Mergee pode ser substituído em classes de metadados derivadas.
Ver também
- GetMetadata
- de metadados de propriedade de dependência
- Visão geral das propriedades de dependência
- Propriedades de Dependência Personalizadas
.NET Desktop feedback