Metadados de propriedades do Framework (WPF .NET)
Você pode definir opções de metadados de propriedade de estrutura para propriedades de dependência no nível de estrutura do Windows Presentation Foundation (WPF). A designação de nível de estrutura do WPF se aplica quando APIs e executáveis de apresentação do WPF manipulam renderização e vinculação de dados. APIs de apresentação e executáveis consultam o FrameworkPropertyMetadata de uma propriedade de dependência.
Pré-requisitos
O artigo pressupõe um conhecimento básico das propriedades de dependência e que você leu Visão geral das propriedades de dependência. Para seguir os exemplos neste artigo, isso ajuda se você estiver familiarizado com Extensible Application Markup Language (XAML) e souber como escrever aplicativos WPF.
Categorias de metadados de propriedade do Framework
FrameworkPropertyMetadata se enquadra nestas categorias:
Metadados que afetam o layout de um elemento, especificamente os sinalizadores de metadados AffectsArrange, AffectsMeasuree AffectsRender. Você pode definir esses sinalizadores se a implementação da propriedade de dependência afetar um aspecto visual e estiver implementando MeasureOverride ou ArrangeOverride na sua classe. Os métodos
MeasureOverride
eArrangeOverride
fornecem informações de comportamento e renderização específicas da implementação para o sistema de layout. QuandoAffectsArrange
,AffectsMeasure
ouAffectsRender
são definidos comotrue
nos metadados de uma propriedade de dependência e seu valor efetivo é alterado, o sistema de propriedades WPF iniciará uma solicitação para invalidar a representação visual do elemento, para iniciar um redesenho.Metadados que afetam o layout do elemento pai de um elemento, especificamente os sinalizadores de metadados AffectsParentArrange e AffectsParentMeasure. Exemplos de propriedades de dependência do WPF que definem esses sinalizadores são FixedPage.Left e Paragraph.KeepWithNext.
Metadados de herança de valor de propriedade, especificamente as bandeiras de metadados Inherits e OverridesInheritanceBehavior. Por padrão, as propriedades de dependência não herdam valores. OverridesInheritanceBehavior permite que o trajeto de herança se propague para uma árvore visual, o que é necessário para alguns cenários de composição de controlos. Para obter mais informações, consulte Herança de valor de propriedade.
Observação
O termo "herda" no contexto de valores de propriedade é específico para propriedades de dependência e não está diretamente relacionado a tipos de código gerenciado e herança de membros por meio de tipos derivados. No contexto das propriedades de dependência, isto implica que os elementos filhos podem herdar valores de propriedades de dependência dos elementos pais.
Metadados de vinculação de dados, especificamente os sinalizadores de metadados BindsTwoWayByDefault e IsNotDataBindable. Por padrão, as propriedades de dependência na estrutura do WPF oferecem suporte à vinculação unidirecional. Considere definir a vinculação bidirecional como padrão para propriedades que relatam o estado , e são modificáveis por ação do usuário, por exemplo, IsSelected. Além disso, considere definir a associação bidirecional como padrão quando os usuários de um controle esperam que uma propriedade a implemente, por exemplo, TextBox.Text.
BindsTwoWayByDefault
afeta apenas o modo de vinculação padrão. Para editar a direção do fluxo de dados de uma ligação, defina Binding.Mode. Você pode usarIsNotDataBindable
para desativar a vinculação de dados quando não houver nenhum caso de uso para ela. Para obter mais informações sobre associações de dados, consulte Visão geral da vinculação de dados.Registro no diário de metadados, especificamente o sinalizador de metadados Journal. O valor padrão do sinalizador
Journal
só étrue
para algumas propriedades de dependência, como SelectedIndex. Os controles de entrada do usuário devem definir o sinalizadorJournal
para propriedades cujos valores contêm seleções de usuário que precisam ser armazenadas. O sinalizadorJournal
é lido por aplicativos ou serviços que oferecem suporte à jornalização, incluindo serviços de jornalização do WPF. Para obter informações sobre como armazenar etapas de navegação, consulte Visão geral da navegação.
FrameworkPropertyMetadata deriva diretamente de UIPropertyMetadatae implementa as bandeiras discutidas aqui. A menos que seja especificamente definido, os FrameworkPropertyMetadata
flags têm um valor padrão de false
.
Lendo FrameworkPropertyMetadata
Para recuperar metadados de uma propriedade de dependência, chame GetMetadata no identificador DependencyProperty. A chamada GetMetadata
retorna um objeto PropertyMetadata
. Se você precisar consultar valores de metadados da estrutura, converta PropertyMetadata
para FrameworkPropertyMetadata.
Especificando FrameworkPropertyMetadata
Ao registrar uma propriedade de dependência, você tem a opção de criar e atribuir metadados a ela. O objeto de metadados que você atribui pode ser PropertyMetadata ou uma de suas classes derivadas, como FrameworkPropertyMetadata. Escolha FrameworkPropertyMetadata
para propriedades de dependência que dependem de APIs de apresentação WPF e executáveis para renderização e vinculação de dados. Uma opção mais avançada é derivar de FrameworkPropertyMetadata
para criar uma classe de relatório de metadados personalizada com mais sinalizadores. Ou, você pode usar UIPropertyMetadata para propriedades não-estrutura que afetam a renderização da interface do usuário.
Embora as opções de metadados sejam normalmente definidas durante o registro de uma nova propriedade de dependência, você pode reespecificá-las em chamadas OverrideMetadata ou AddOwner. Ao substituir metadados, sempre substitua pelo mesmo tipo de metadados que foi usado durante o registro de propriedade.
As características da propriedade que são expostas por FrameworkPropertyMetadata
são às vezes chamadas de indicadores. Se você estiver criando uma instância FrameworkPropertyMetadata
, há duas maneiras de preencher valores de sinalizador:
Defina os sinalizadores em uma instância do tipo de enumeração FrameworkPropertyMetadataOptions.
FrameworkPropertyMetadataOptions
permite especificar sinalizadores de metadados na combinação de OR bit a bit. Em seguida, instancieFrameworkPropertyMetadata
usando um construtor que tenha um parâmetroFrameworkPropertyMetadataOptions
e passe sua instânciaFrameworkPropertyMetadataOptions
. Para alterar sinalizadores de metadados depois de passarFrameworkPropertyMetadataOptions
para o construtor FrameworkPropertyMetadata, altere a propriedade correspondente na nova instânciaFrameworkPropertyMetadata
. Por exemplo, se definires o flag FrameworkPropertyMetadataOptions.NotDataBindable, podes desfazer isso definindo FrameworkPropertyMetadata.IsNotDataBindable comofalse
.Instancie
FrameworkPropertyMetadata
usando um construtor que não tenha um parâmetroFrameworkPropertyMetadataOptions
e, em seguida, defina os sinalizadores de Boolean aplicáveis emFrameworkPropertyMetadata
. Defina valores de sinalizador antes de associar sua instânciaFrameworkPropertyMetadata
a uma propriedade de dependência, caso contrário, você obterá um InvalidOperationException.
Comportamento de substituição de metadados
Quando você substitui os metadados da propriedade da estrutura, os valores de metadados alterados substituem ou são mesclados com os valores originais:
Para um PropertyChangedCallback, a lógica de fusão padrão retém os valores anteriores de
PropertyChangedCallback
em uma tabela, e todos são invocados numa mudança de propriedade. A ordem de execução do callback é determinada pelo nível da classe, em que um callback registado pela classe base na hierarquia é executado primeiro. Os callbacks herdados são executados apenas uma vez e pertencem à classe que os adicionou aos metadados.No caso de um DefaultValue, o novo valor substituirá o valor padrão existente. Se você não especificar um
DefaultValue
nos metadados de substituição e se o FrameworkPropertyMetadata existente tiver o sinalizadorInherits
definido, o valor padrão virá do ancestral mais próximo que especificouDefaultValue
nos metadados.No caso de um CoerceValueCallback, o novo valor substituirá um valor do
CoerceValueCallback
existente. Se você não especificar umCoerceValueCallback
nos metadados de substituição, o valor virá do ancestral mais próximo na cadeia de herança que especificou umCoerceValueCallback
.Para
FrameworkPropertyMetadata
sinalizadores não herdados, você pode substituir o valor defalse
padrão por um valortrue
. No entanto, você só pode substituir um valortrue
por um valorfalse
para Inherits, Journal, OverridesInheritanceBehaviore SubPropertiesDoNotAffectRender.
Observação
A lógica de mesclagem padrão é implementada pelo método Merge. Você pode especificar a lógica de mesclagem personalizada em uma classe derivada que herda uma propriedade de dependência, substituindo Merge
nessa classe.
Ver também
- PropertyMetadata
- GetMetadata
- OverrideMetadata
- AddOwner
- Metadados de Propriedade de Dependência
- Visão geral das propriedades de dependência
- propriedades de dependência personalizadas
.NET Desktop feedback