Metadatos de las propiedades de marco (WPF .NET)
Puede establecer opciones de metadatos de propiedad de marco para las propiedades de dependencia en el nivel de marco de Windows Presentation Foundation (WPF). La designación de nivel de marco de WPF se aplica cuando las API de presentación de WPF y los ejecutables controlan la representación y el enlace de datos. Las API de presentación y los ejecutables consultan el FrameworkPropertyMetadata de una propiedad de dependencia.
Requisitos previos
En el artículo se da por supuesto un conocimiento básico de las propiedades de dependencia y que ha leído Información general sobre las propiedades de dependencia. Para seguir los ejemplos de este artículo, resultará útil que esté familiarizado con el Lenguaje de marcado de aplicación extensible (XAML) y sepa cómo escribir aplicaciones WPF.
Categorías de metadatos de las propiedades de marco
FrameworkPropertyMetadata se dividen en estas categorías:
Metadatos que afectan al diseño de un elemento, específicamente las marcas de metadatos AffectsArrange, AffectsMeasure y AffectsRender. Puede establecer esas marcas si la implementación de la propiedad de dependencia afecta a un aspecto visual y está implementando MeasureOverride o ArrangeOverride en la clase. Los métodos
MeasureOverride
yArrangeOverride
proporcionan información de representación y comportamiento específicos de la implementación en el sistema de diseño. CuandoAffectsArrange
,AffectsMeasure
oAffectsRender
se establecen entrue
en los metadatos de una propiedad de dependencia y su valor efectivo cambia, el sistema de propiedades de WPF iniciará una solicitud para invalidar los objetos visuales del elemento para desencadenar un nuevo dibujo.Metadatos que afectan al diseño de un elemento primario de un elemento, específicamente las marcas de metadatos AffectsParentArrange y AffectsParentMeasure. Ejemplos de propiedades de dependencia de WPF que establecen estas marcas son FixedPage.Left y Paragraph.KeepWithNext.
Metadatos de herencia de valores de propiedad, específicamente las marcas de metadatos Inherits y OverridesInheritanceBehavior. De manera predeterminada, las propiedades de dependencia no heredan los valores. OverridesInheritanceBehavior permite que la ruta de herencia también viaje a un árbol visual, lo cual es necesario para algunos escenarios de composición de control. Para más información, consulte Herencia de valores de propiedad.
Nota:
El término «hereda» en el contexto de los valores de propiedad es específico de las propiedades de dependencia y no se relaciona directamente con los tipos de código administrado y la herencia de miembros a través de tipos derivados. En el contexto de las propiedades de dependencia, significa que los elementos secundarios pueden heredar valores de propiedad de dependencia de los elementos primarios.
Metadatos de enlace de datos, específicamente las marcas de metadatos BindsTwoWayByDefault y IsNotDataBindable. De forma predeterminada, las propiedades de dependencia del marco WPF admiten el enlace unidireccional. Considere la posibilidad de establecer el enlace bidireccional como valor predeterminado para las propiedades que notifican el estado y pueden ser modificadas por la acción del usuario, por ejemplo IsSelected. Además, considere la posibilidad de establecer el enlace bidireccional como valor predeterminado cuando los usuarios de un control esperan que una propiedad lo implemente, por ejemplo TextBox.Text.
BindsTwoWayByDefault
solo afecta al modo de enlace predeterminado. Para editar la dirección del flujo de datos de un enlace, establezca Binding.Mode. Puede usarIsNotDataBindable
para deshabilitar el enlace de datos cuando no hay ningún caso de uso para él. Para más información sobre el enlace de datos, consulte Información general sobre el enlace de datos.Metadatos de registro en diario, específicamente la marca de metadatos Journal. El valor predeterminado de la marca
Journal
es solotrue
para algunas propiedades de dependencia, como SelectedIndex. Los controles de entrada de usuario deben establecer la marcaJournal
para las propiedades cuyos valores contienen selecciones de usuario que deben almacenarse. Las aplicaciones o los servicios que admiten el registro en diario leen la marcaJournal
, incluidos los servicios de registro en diario de WPF. Para obtener información sobre cómo almacenar los pasos de navegación, consulte Información general sobre la navegación.
FrameworkPropertyMetadata deriva directamente de UIPropertyMetadata e implementa las marcas que se describen aquí. A menos que se establezca específicamente, las marcas FrameworkPropertyMetadata
tienen un valor predeterminado de false
.
Leer FrameworkPropertyMetadata
Para recuperar los metadatos de una propiedad de dependencia, llame a GetMetadata del identificador DependencyProperty. La llamada GetMetadata
devuelve un objeto PropertyMetadata
. Si necesita consultar los valores de metadatos del marco, convierta PropertyMetadata
en FrameworkPropertyMetadata.
Especificar FrameworkPropertyMetadata
Al registrar una propiedad de dependencia, tiene la opción de crear metadatos y asignárselos. El objeto de metadatos que asigne puede ser PropertyMetadata o una de sus clases derivadas, como FrameworkPropertyMetadata. Elija FrameworkPropertyMetadata
para las propiedades de dependencia que se basan en las API de presentación de WPF y los ejecutables para la representación y el enlace de datos. Una opción más avanzada consiste en derivar de FrameworkPropertyMetadata
para crear una clase de informes de metadatos personalizada con más marcas. O bien, puede usar UIPropertyMetadata para propiedades que no son de marco y que afectan a la representación de la interfaz de usuario.
Aunque las opciones de metadatos se establecen normalmente durante el registro de una nueva propiedad de dependencia, se pueden volver a especificar en llamadas OverrideMetadata o AddOwner. Al invalidar los metadatos, invalide siempre con el mismo tipo de metadatos que se ha usado durante el registro de propiedades.
Las características de propiedad expuestas por FrameworkPropertyMetadata
a veces se conocen como marcas. Si va a crear una instancia FrameworkPropertyMetadata
, hay dos maneras de rellenar los valores de marca:
Establezca las marcas en una instancia del tipo de enumeración FrameworkPropertyMetadataOptions.
FrameworkPropertyMetadataOptions
permite especificar marcas de metadatos en combinación OR bit a bit. A continuación, cree una instanciaFrameworkPropertyMetadata
mediante un constructor que tenga un parámetroFrameworkPropertyMetadataOptions
y pase la instanciaFrameworkPropertyMetadataOptions
. Para cambiar las marcas de metadatos después de pasarFrameworkPropertyMetadataOptions
al constructor FrameworkPropertyMetadata, cambie la propiedad correspondiente en la nueva instanciaFrameworkPropertyMetadata
. Por ejemplo, si establece la marca FrameworkPropertyMetadataOptions.NotDataBindable, podrá revertirlo estableciendo FrameworkPropertyMetadata.IsNotDataBindable enfalse
.Cree una instancia
FrameworkPropertyMetadata
mediante un constructor que no tenga un parámetroFrameworkPropertyMetadataOptions
y, a continuación, establezca las marcas aplicables Boolean enFrameworkPropertyMetadata
. Establezca los valores de marca antes de asociar la instanciaFrameworkPropertyMetadata
con una propiedad de dependencia; de lo contrario, obtendrá un InvalidOperationException.
Comportamiento de invalidación de metadatos
Al invalidar los metadatos de propiedad del marco, los valores de metadatos modificados reemplazan a o se combinan con los valores originales:
Para un PropertyChangedCallback, la lógica de combinación predeterminada almacena todos los valores previos de
PropertyChangedCallback
en una tabla y todos se invocan en un cambio de propiedad. El orden de devolución de llamada viene determinado por la profundidad de clase, donde una devolución de llamada registrada por la clase base en la jerarquía se ejecutaría primero. Las devoluciones de llamada heredadas se ejecutan una sola vez y son propiedad de la clase que las ha agregado a los metadatos.Para un DefaultValue, el nuevo valor reemplazará el valor predeterminado existente. Si no especifica un
DefaultValue
en los metadatos de invalidación y si el FrameworkPropertyMetadata existente tiene la marcaInherits
establecida, el valor predeterminado procede del antecesor más cercano que ha especificadoDefaultValue
en los metadatos.Para un CoerceValueCallback, el nuevo valor reemplazará el valor
CoerceValueCallback
existente. Si no especifica unCoerceValueCallback
en la invalidación de metadatos, el valor procede del antecesor más cercano en la cadena de herencia que ha especificado unCoerceValueCallback
.En el caso de las marcas no heredadas
FrameworkPropertyMetadata
, puede invalidar el valor predeterminadofalse
con un valortrue
. Sin embargo, solo puede invalidar un valortrue
con un valorfalse
para Inherits, Journal, OverridesInheritanceBehavior y SubPropertiesDoNotAffectRender.
Nota:
El método Merge implementa la lógica de combinación predeterminada. Puede especificar la lógica de combinación personalizada en una clase derivada que hereda una propiedad de dependencia mediante la invalidación de Merge
en esa clase.
Vea también
.NET Desktop feedback