Información general sobre elementos base

Un porcentaje elevado de clases de Windows Presentation Foundation (WPF)deriva de cuatro clases a las que se hace referencia normalmente en la documentación de SDK como clases de elementos base. Estas clases son UIElement, FrameworkElement, ContentElement y FrameworkContentElement. La clase DependencyObject también está relacionada, porque es una clase base común de UIElement y ContentElement

API de elementos base en clases de WPF

Tanto UIElement como ContentElement se derivan de DependencyObject, a través de vías algo diferentes. La división en este nivel está relacionada con el uso de UIElement o ContentElement en una interfaz de usuario y su finalidad en una aplicación. UIElement también tiene Visual en su jerarquía de clases, que es una clase que expone la compatibilidad con gráficos de nivel inferior subyacente a Windows Presentation Foundation (WPF). Visual proporciona un marco de representación mediante la definición de regiones de pantalla rectangulares independientes. En la práctica, UIElement está destinado a elementos que admitirán un modelo de objetos mayor, están pensados para representarse y disponerse en regiones que pueden describirse como regiones de pantalla rectangulares, y donde el modelo de contenido es deliberadamente más abierto, para permitir diferentes combinaciones de elementos. ContentElement no deriva de Visual; su modelo es que un ContentElement sería consumido por algo más, como un lector o visor que entonces interpretaría los elementos y produciría el Visual completo para que Windows Presentation Foundation (WPF) lo consuma. Algunas clases UIElement están destinadas a ser anfitrionas de contenido: proporcionan el hospedaje y la representación de una o más clases ContentElement (DocumentViewer es un ejemplo de este tipo de clases). ContentElement se usa como clase base para los elementos con modelos de objetos un poco más pequeños y que tratan más ampliamente el texto, la información o el contenido de los documentos que podrían hospedarse en UIElement.

Nivel de marco y nivel básico

UIElement sirve como clase base para FrameworkElement, y ContentElement sirve como clase base para FrameworkContentElement. El motivo de este nivel superior de clases es admitir un nivel básico de WPF independiente de un nivel de marco de WPF, con esta división también presente en la manera de dividir las API entre los ensamblados PresentationCore y PresentationFramework. El nivel de marco de WPF presenta una solución más completa para las necesidades básicas de las aplicaciones, incluida la implementación del administrador de diseño para la presentación. El nivel básico de WPF proporciona una manera de usar gran parte de WPF sin la sobrecarga del ensamblado adicional. La distinción entre estos niveles muy rara vez es importante para los escenarios de desarrollo de aplicaciones más habituales y, en general, podría considerar las API de WPF como un todo, sin preocuparse por la diferencia entre el nivel de marco de WPF y el nivel básico de WPF. Es posible que deba conocer las diferencias de nivel si el diseño de su aplicación opta por reemplazar una cantidad importante de funciones de nivel de marco de WPF, como, por ejemplo, si toda la solución ya tiene sus propias implementaciones de composición y diseño de la interfaz de usuario (UI).

Elección del elemento del que va a derivar

La manera más práctica para crear una clase personalizada que amplíe WPF es que derive de una de las clases de WPF, donde se obtiene la máxima cantidad de funcionalidad deseada a través de la jerarquía de clases existente. En esta sección se muestra la funcionalidad que se incluye con tres de las clases de elementos más importantes para ayudarle a decidir de qué clase se debe heredar.

Si está implementando un control, que es una de las razones más comunes para la derivación de una clase de WPF, es probable que quiera que derive de una clase que sea un control práctico, una clase base de familia de control o, al menos, de la clase base Control. Para obtener orientación y ejemplos prácticos, consulte Información general sobre la creación de controles.

Si no está creando un control y necesita derivar de una clase superior en la jerarquía, las siguientes secciones son una guía de las características que se definen en cada clase de elemento base.

Si crea una clase que deriva de DependencyObject, hereda la funcionalidad siguiente:

  • Compatibilidad de GetValue y SetValue, y compatibilidad del sistema de propiedad general.

  • Capacidad de usar las propiedades de dependencia y las propiedades adjuntas que están implementadas como propiedades de dependencia.

Si se crea una clase que derive de UIElement, se hereda la siguiente funcionalidad además de la proporcionada por DependencyObject:

Si se crea una clase que derive de FrameworkElement, se hereda la siguiente funcionalidad además de la proporcionada por UIElement:

  • Compatibilidad con estilos y guiones gráficos. Para obtener más información, vea Style y Introducción a los guiones gráficos.

  • Compatibilidad con el enlace de datos. Para obtener más información, consulte Información general sobre el enlace de datos.

  • Compatibilidad con las referencias de recursos dinámicos. Para obtener más información, consulte Recursos XAML.

  • Compatibilidad con la herencia de valores de propiedad y otras marcas en los metadatos, que ayudan a comunicar condiciones sobre las propiedades a los servicios de marco, como el enlace de datos, los estilos o la implementación del marco del diseño. Para obtener más información, consulte Metadatos de las propiedades de marco de trabajo.

  • Concepto del árbol lógico. Para obtener más información, consulte Árboles en WPF.

  • Compatibilidad con la implementación de nivel de marco de WPF práctica del sistema de diseño, incluyendo una invalidación de OnPropertyChanged que puede detectar cambios en las propiedades que influyen en el diseño.

Si se crea una clase que derive de ContentElement, se hereda la siguiente funcionalidad además de la proporcionada por DependencyObject:

Si se crea una clase que derive de FrameworkContentElement, se obtiene la siguiente funcionalidad además de la proporcionada por ContentElement:

  • Compatibilidad con estilos y guiones gráficos. Para obtener más información, vea Style e Información general sobre animaciones.

  • Compatibilidad con el enlace de datos. Para obtener más información, consulte Información general sobre el enlace de datos.

  • Compatibilidad con las referencias de recursos dinámicos. Para obtener más información, consulte Recursos XAML.

  • Compatibilidad con la herencia de valores de propiedad y otras marcas en los metadatos que ayudan a comunicar condiciones sobre las propiedades a los servicios de marco, como el enlace de datos, los estilos o la implementación del marco del diseño. Para obtener más información, consulte Metadatos de las propiedades de marco de trabajo.

  • No se hereda el acceso a las modificaciones del sistema de diseño (como ArrangeOverride). Las implementaciones del sistema de diseño solo están disponibles en FrameworkElement. Sin embargo, hereda una invalidación OnPropertyChanged que puede detectar cambios en las propiedades que influyen en el diseño y comunicárselas a cualquier host de contenido.

Los modelos de contenido se documentan para distintas clases. El modelo de contenido de una clase es uno de los factores posibles que debe considerar si quiere buscar una clase adecuada de la que derivar. Para obtener más información, consulte Modelo de contenido de WPF.

Otras clases base

DispatcherObject

DispatcherObject proporciona soporte para el modelo de subprocesos de WPF y permite que todos los objetos creados para las aplicaciones WPF se asocien a un Dispatcher. Aunque no derive de UIElement, DependencyObject o Visual, debería considerar derivar de DispatcherObject para obtener esta compatibilidad de modelo de subprocesos. Para obtener más información, consulte Modelo de subprocesos.

Visual

Visual implementa el concepto de un objeto 2D que normalmente requiere la presentación visual de una región más o menos rectangular. La representación real de una clase Visual ocurre en otras clases (no es autocontenida), pero la clase Visual proporciona un tipo conocido que los procesos de representación usan en distintos niveles. Visual implementa las pruebas de posicionamiento, pero no expone los eventos que comunican resultados positivos de dichas pruebas (estos se encuentran en UIElement). Para obtener más información, consulte Programación de capas visuales.

Inmovilizable

Freezable simula la inmutabilidad en un objeto mutable, para lo cual proporciona los medios para generar copias del objeto cuando se necesita o se quiere un objeto inmutable por motivos de rendimiento. El tipo Freezable proporciona una base común para algunos elementos gráficos, como geometrías y pinceles, así como animaciones. En concreto, la clase Freezable no es una clase Visual; puede contener propiedades que se convierten en subpropiedades cuando la clase Freezable se aplica para rellenar un valor de propiedad de otro objeto. Esas subpropiedades podrían afectar a la representación. Para obtener más información, consulte Información general sobre objetos Freezable.

Animatable

Animatable es una clase derivada de Freezable que agrega específicamente la capa de control de animaciones y algunos miembros de utilidad, de modo que las propiedades animadas actualmente se puedan distinguir de las no animadas.

Control

Control es la clase base prevista para el tipo de objeto que se denomina control o componente, dependiendo de la tecnología. En general, las clases de control WPF son clases que representan directamente un control de interfaz de usuario o que participan estrechamente en la composición del control. La principal funcionalidad que permite Control es la de controlar las plantillas.

Vea también