Información general sobre elementos base

Un porcentaje elevado de clases de Windows Presentation Foundation (WPF) se derivan de cuatro clases a las que se suele hacer referencia en la documentación del 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 de ContentElement

Este tema contiene las secciones siguientes.

  • API de elementos base en las clases de WPF
  • Elegir el elemento del que derivar una clase
  • Otras clases base
  • Temas relacionados

API de elementos base en las clases de WPF

Tanto UIElement como ContentElement se derivan de DependencyObject, aunque mediante rutas ligeramente distintas. La diferencia en este nivel reside en el modo de utilizar los elementos UIElement o ContentElement en una interfaz de usuario y en su finalidad dentro de una aplicación. Además, UIElement tiene Visual en su jerarquía de clases, que es una clase que expone la compatibilidad con los gráficos de bajo nivel que subyacen en Windows Presentation Foundation (WPF). Visual proporciona un marco de trabajo de presentación para definir zonas de la pantalla rectangulares independientes. En la práctica, UIElement es para elementos que admitan un modelo de objetos mayor, se han diseñado para presentar y diseñar en zonas que pueden describirse como zonas de la pantalla rectangulares y donde el modelo de contenido es deliberadamente más abierto, a fin de permitir diferentes combinaciones de elementos. ContentElement no se deriva de Visual; su modelo consiste en que un elemento ContentElement sea consumido por otro elemento, como un lector o un visor, que a su vez interpretarán los elementos y producirán el objeto Visual completo utilizado por Windows Presentation Foundation (WPF). Algunas clases UIElement están diseñadas para ser hosts de contenido: proporcionan hospedaje y presentación para una o más clases ContentElement (DocumentViewer es un ejemplo de una clase de este tipo). ContentElement se utiliza como clase base para elementos con modelos de objetos algo más reducidos, más dirigidos a contenido de texto, información o documentos que puedan hospedarse en un elemento UIElement.

Nivel del marco de trabajo y nivel básico

UIElement actúa como clase base para FrameworkElement, y ContentElement actúa como clase base para FrameworkContentElement. La razón de ser de este siguiente nivel de clases es la compatibilidad con el nivel básico de WPF, independiente del nivel de marco de trabajo de WPF; esta división también está presente en cómo se dividen las APIs entre los ensamblados PresentationCore y PresentationFramework. El nivel de marco de trabajo de WPF presenta una solución más completa para las necesidades de aplicaciones básicas, que incluye la implementación del administrador de diseño para presentación. El nivel básico de WPF proporciona una manera de utilizar gran parte de WPF sin la sobrecarga del ensamblado adicional. La distinción entre estos niveles casi nunca es relevante en la mayoría de los escenarios típicos de programación de aplicaciones y, en general, es preferible pensar en las APIs de WPF en conjunto sin preocuparse por la diferencia entre el nivel de marco de trabajo de WPF y el nivel básico de WPF. Puede que necesite conocer estas distinciones de nivel si en el diseño de una aplicación se opta por reemplazar cantidades importantes de funcionalidades del nivel de marco de trabajo de WPF; por ejemplo, si la solución global ya tiene sus propias implementaciones de composición y diseño de user interface (UI).

Elegir el elemento del que derivar una clase

La manera más práctica de crear una clase personalizada que extienda WPF consiste en derivar de una de las clases de WPF que permita obtener la máxima cantidad posible de la funcionalidad deseada a través de la jerarquía de clases existente. En esta sección, se muestra una lista de funcionalidades suministradas con las principales clases de elementos, a fin de ayudarle a decidir de qué clase se debe heredar.

Si está implementando un control, que es una de las razones más comunes para derivar de una clase de WPF, es probable que sea conveniente derivar de una clase que sea un control práctico, una clase base de una familia de controles o, como mínimo, de la clase base Control. Para obtener orientación y ejemplos prácticos, vea Información general sobre la creación de controles.

Si no está creando un control y necesita derivar de una clase situada en un punto más alto de la jerarquía, las secciones siguientes le ofrecen información sobre las características definidas en cada clase de elementos base.

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

  • Compatibilidad con GetValue y SetValue, así como con el sistema de propiedades general.

  • Capacidad para utilizar propiedades de dependencia y propiedades adjuntas, que se implementan como propiedades de dependencia.

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

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

  • Compatibilidad con la aplicación de estilos y los guiones gráficos. Para obtener más información, vea Style y Información general sobre objetos Storyboard.

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

  • Compatibilidad con referencias de recurso dinámicas. Para obtener más información, vea Información general sobre recursos.

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

  • El concepto de árbol lógico. Para obtener más información, vea Árboles en WPF.

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

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

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

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

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

  • Compatibilidad con referencias de recurso dinámicas. Para obtener más información, vea Información general sobre recursos.

  • Compatibilidad con la herencia de valores de propiedades y otros marcadores de los metadatos que ayudan a comunicar condiciones sobre las propiedades a los servicios del marco de trabajo, tales como el enlace de datos, los estilos o la implementación del diseño en el marco de trabajo. Para obtener más información, vea 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 únicamente están disponibles en FrameworkElement. Sin embargo, sí heredará una invalidación de OnPropertyChanged capaz de detectar los cambios de propiedades que influyen en el diseño y comunicárselas a cualquier host de contenido.

Se documentan modelos de contenido para gran variedad de clases. El modelo de contenido de una clase es uno de los factores posibles que deben tenerse en cuenta al buscar la clase adecuada para derivarla. Para obtener más información, vea Modelo de contenido de WPF.

Otras clases base

DispatcherObject

DispatcherObject proporciona compatibilidad con el modelo de subprocesos de WPF y permite asociar todos los objetos creados para aplicaciones de WPF a Dispatcher. Aunque no se derive de UIElement, DependencyObject o de Visual, puede ser conveniente derivar de DispatcherObject para obtener esta compatibilidad con el modelo de subprocesos. Para obtener más información, vea Modelo de subprocesos.

Visual

Visual implementa el concepto de objeto 2D que, en general, requiere la presentación visual en una zona con una forma más o menos rectangular. La representación real de Visual tiene lugar en otras clases (no es autónoma), pero la clase Visual proporciona un tipo conocido que los procesos de presentación utilizan en varios niveles. Visual implementa las pruebas de posicionamiento, pero no expone eventos que comunican los casos positivos de ello (éstos se encuentran en UIElement). Para obtener más información, vea Programación de capas visuales.

Freezable

Freezable simula la inmutabilidad en un objeto mutable; para ello, proporciona un medio de generar copias del mismo cuando se necesita o desea un objeto inmutable por motivos de rendimiento. El tipo Freezable proporciona una base común para algunos elementos de gráficos, como geometrías y pinceles, así como animaciones. Cabe destacar que un objeto Freezable no es un objeto Visual; puede contener propiedades que se convierten en subpropiedades al aplicar el objeto Freezable para rellenar el valor de una propiedad de otro objeto, subpropiedades que pueden afectar a la representación. Para obtener más información, vea Información general sobre objetos Freezable.

Animatable

Animatable es una clase derivada de Freezable que agrega de manera específica la capa de control de animación y algunos miembros de utilidad, a fin de permitir que las propiedades actualmente animadas se distingan de las propiedades no animadas.

Control

Control es la clase base dirigida al tipo de objeto que se denomina o bien control o bien componente, dependiendo de la tecnología. En general, las clases de controles de WPF son aquéllas que representan directamente un control de interfaz de usuario o que participan estrechamente en la composición de controles. La funcionalidad primaria habilitada por Control es la creación de plantillas de controles.

Vea también

Referencia

Control

Conceptos

Información general sobre las propiedades de dependencia

Información general sobre la creación de controles

Arquitectura de WPF