Metadados de propriedade de estrutura
As opções de metadados de propriedade da estrutura são relatadas para as propriedades dos elementos de objeto considerados no nível da estrutura 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 propriedades são manipulados pelas APIs de apresentação e executáveis do WPF. Metadados de propriedade de estrutura é consultado por esses sistemas para determinar características específicas de recurso de propriedades de elemento específico.
Pré-requisitos
Este tópico pressupõe que você entende as propriedades de dependência da perspectiva de um consumidor de propriedades de dependência existentes em classes do Windows Presentation Foundation (WPF) e leu a Visão geral das propriedades de dependência. Você também deve ter lido metadados de propriedade de dependência.
O que é comunicado por metadados de propriedades de estrutura
Metadados de propriedade de estrutura podem ser divididos nas seguintes categorias:
Relatando propriedades de layout que afetam um elemento (AffectsArrange, , AffectsMeasureAffectsRender). Você pode definir esses sinalizadores em metadados se a propriedade afetar esses respectivos aspectos e também estiver implementando os MeasureOverride / ArrangeOverride métodos em sua classe para fornecer informações e comportamento de renderização específicos para o sistema de layout. Normalmente, tal implementação deve verificar para invalidações de propriedade nas propriedades de dependência em que qualquer uma dessas propriedades de layout eram "verdadeiras" nos metadados de propriedade e somente essas exigiriam uma 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 viaje para uma árvore visual, o que é necessário para alguns cenários de composição de controle.
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 um recurso de nível de estrutura WPF do sistema de propriedades WPF. Não tem nada a ver diretamente com herança de tipo e membros de código gerenciado por tipos derivados. Para obter detalhes, consulte Herança do valor da propriedade.
Relatando características de vinculação de dados (IsNotDataBindable, BindsTwoWayByDefault). Por padrão, as propriedades de dependência na estrutura dão suporte à vinculação de dados, com um comportamento de associação unidirecional. Você poderia desabilitar a vinculação de dados se não houvesse nenhum cenário para isso (como eles se destinam a ser flexíveis e extensíveis, não há muitos exemplos de tais propriedades nas APIs padrão do WPF). Você pode definir a vinculação como tendo um padrão bidirecional para propriedades que vinculam os comportamentos de um controle entre suas partes de componente ( é um exemplo) ou onde a vinculação bidirecional é o cenário comum e esperado para os usuários (IsSubmenuOpenText é um exemplo). Alterar os metadados relacionados a vinculação de dados somente influencia o padrão; em uma base por associação esse padrão sempre pode ser alterado. Para obter detalhes sobre modos de associação e associação em geral, consulte visão geral de vinculação de dados.
Relatar 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 está habilitado por padrão, mas ele é habilitado seletivamente para certos 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 em listas que devem ser persistentes nas etapas de navegação. Para obter informações sobre o diário, consulte visão geral da navegação.
Leitura do FrameworkPropertyMetadata
Cada uma das propriedades vinculadas acima são as propriedades específicas que o FrameworkPropertyMetadata adiciona à sua classe UIPropertyMetadatabase imediata. Cada uma dessas propriedades será false
, por padrão. Uma solicitação de metadados para uma propriedade em que saber o valor dessas propriedades é importante deve tentar converter os metadados retornados para FrameworkPropertyMetadatao e verificar os valores das propriedades individuais conforme necessário.
Especificação dos 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 opção de qual classe de metadados usar: a base PropertyMetadata ou alguma classe derivada, como FrameworkPropertyMetadata. Em geral, você deve usar FrameworkPropertyMetadatao , particularmente se sua propriedade tiver alguma interação com o sistema de propriedades e funções do WPF, como layout e vinculação de dados. Outra opção para cenários mais sofisticados é derivar de para criar sua própria classe de relatório de FrameworkPropertyMetadata metadados com informações extras transportadas em seus membros. Ou você pode usar PropertyMetadata ou UIPropertyMetadata comunicar o grau de suporte para recursos de sua implementação.
Para propriedades existentes (AddOwner ou OverrideMetadata chamada), você deve sempre substituir pelo tipo de metadados usado pelo registro original.
Se você estiver criando uma FrameworkPropertyMetadata instância, 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 FrameworkPropertyMetadata construtor que permite um
flags
parâmetro. Esse parâmetro deve ser preenchido com todos os valores combinados desejados dos FrameworkPropertyMetadataOptions sinalizadores de enumeração.Use uma das assinaturas sem um
flags
parâmetro e, em seguida, defina cada propriedade booleana de relatório paratrue
FrameworkPropertyMetadata cada alteração de característica desejada. Se você fizer isso, você deverá definir essas propriedades antes de quaisquer elementos com esta propriedade de dependência sejam construídos; as propriedades boolianas são leitura / gravação para permitir que esse comportamento de evitar oflags
parâmetro e ainda preencher os metadados, mas os metadados devem ficar efetivamente selados antes de usar a propriedade. Assim, a tentativa de definir as propriedades, depois de solicitar os metadados, será uma operação inválida.
Comportamento de mesclagem de metadados de propriedades de estrutura
Quando você substitui metadados de propriedade de estrutura, as diferentes características dos metadados são mescladas ou substituídas.
PropertyChangedCallback é mesclado. Se você adicionar um novo PropertyChangedCallback, esse retorno de chamada será armazenado nos metadados. Se você não especificar um PropertyChangedCallback na substituição, o valor de PropertyChangedCallback será promovido como uma referência do ancestral mais próximo que o especificou nos metadados.
O comportamento real do sistema de propriedades é PropertyChangedCallback que as implementações para todos os proprietários de metadados na hierarquia são retidas e adicionadas a uma tabela, com a ordem de execução pelo sistema de propriedades sendo que os retornos de chamada da classe derivada mais profundamente são invocados primeiro. Retornos de chamada herdados são executados somente uma vez, contando como sendo pertencente a classe que colocou-os nos metadados.
DefaultValue é substituído. Se você não especificar um PropertyChangedCallback na substituição, o valor de DefaultValue vem do ancestral mais próximo que o especificou nos metadados.
CoerceValueCallback as implementações são substituídas. Se você adicionar um novo CoerceValueCallback, esse retorno de chamada 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 somente os CoerceValueCallback metadados imediatos são chamados. Nenhuma referência a outras CoerceValueCallback implementações na hierarquia é mantida.
Os sinalizadores de FrameworkPropertyMetadataOptions enumeração são combinados 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 original FrameworkPropertyMetadata definir o FrameworkPropertyMetadataOptions.NotDataBindable sinalizador, você poderá alterá-lo definindo FrameworkPropertyMetadata.IsNotDataBindable como
false
.
Esse comportamento é implementado pelo Merge, e pode ser substituído em classes de metadados derivadas.
Confira também
.NET Desktop feedback