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.

Importante

La documentación de la guía de escritorio para .NET 7 y .NET 6 está en proceso de elaboración.

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 y ArrangeOverride proporcionan información de representación y comportamiento específicos de la implementación en el sistema de diseño. Cuando AffectsArrange, AffectsMeasure o AffectsRender se establecen en true 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 usar IsNotDataBindable 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 solo true para algunas propiedades de dependencia, como SelectedIndex. Los controles de entrada de usuario deben establecer la marca Journal 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 marca Journal, 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:

  1. 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 instancia FrameworkPropertyMetadata mediante un constructor que tenga un parámetro FrameworkPropertyMetadataOptions y pase la instancia FrameworkPropertyMetadataOptions. Para cambiar las marcas de metadatos después de pasar FrameworkPropertyMetadataOptions al constructor FrameworkPropertyMetadata, cambie la propiedad correspondiente en la nueva instancia FrameworkPropertyMetadata. Por ejemplo, si establece la marca FrameworkPropertyMetadataOptions.NotDataBindable, podrá revertirlo estableciendo FrameworkPropertyMetadata.IsNotDataBindable en false.

  2. Cree una instancia FrameworkPropertyMetadata mediante un constructor que no tenga un parámetro FrameworkPropertyMetadataOptions y, a continuación, establezca las marcas aplicables Boolean en FrameworkPropertyMetadata. Establezca los valores de marca antes de asociar la instancia FrameworkPropertyMetadata 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 marca Inherits establecida, el valor predeterminado procede del antecesor más cercano que ha especificado DefaultValue en los metadatos.

  • Para un CoerceValueCallback, el nuevo valor reemplazará el valor CoerceValueCallback existente. Si no especifica un CoerceValueCallback en la invalidación de metadatos, el valor procede del antecesor más cercano en la cadena de herencia que ha especificado un CoerceValueCallback.

  • En el caso de las marcas no heredadas FrameworkPropertyMetadata, puede invalidar el valor predeterminado false con un valor true. Sin embargo, solo puede invalidar un valor true con un valor false 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