A mi juicio los contenedores en WPF es una cosa que debemos dominar si queremos diseñar una buena aplicación WPF es la parte principal de un buen diseño.
WPF por defecto solo admite la colocación de un solo elemento en una ventana y esta debe de ser un contenedor, cuando creamos un usercontrol o page o window su hijo debe de ser un contenedor. y en este iremos añadiendo controles
En los contenedores de WPF tiene lugar en dos estados: Measure (Medición) y Arrange (distribución).
Measure
En estado de medición (Measure) el contenedor comprueba por cada uno de
los elementos hijos su tamaño deseado, es decir, les “pregunta” que tamaño
pretende ocupar en el contenedor.
Arrange
En este estado de distribución (Arrange), el contenedor coloca a cada uno de
los elementos hijos en su posición apropiada.
Veremos que entender estos estados son importantes cuando desarrollemos nuestros propios contenedores
Clase Panel
La clase abstracta System.Windows.Controls.Panel es de la que derivan todos
los contenedores de WPF. La clase Panel expone un pequeño grupo de
miembros incluyendo las siguientes propiedades públicas:
Background
Utilizando el Brush dado pinta el fondo del panel. Como nota importante
recalcar que debemos asignar un valor no nulo si queremos recibir eventos de
ratón.
Podemos utilizar como color de fondo el transparente y asi disponemos de los
eventos del ratón.
Children
Importante colección donde se almacenan los elementos alojados en el panel.
Nos referimos al primer nivel de elementos hijos, por lo que es posible que
exitan más subniveles.
IsItemsHost
Esta propiedad es verdadera cuando el panel se usa para mostrar elementos
que están asociados con un ItemsControl como los nodos de un ListBox por
ejemplo.
En el siguiente diagrama se muestra la jerarquía de clases de WPF
System.Threading.DispatcherObject
Todos los objetos de WPF derivan de DispatcherObject. WPF trabaja en STA, y el principal objetivo es manejar la concurrencia y threading. Cuando cualquier mensaje como por ejemplo un click del ratón son enviados al DispatcherObject que verifica si el código se está ejecutando en el thread correcto
System.Windows.DependencyObject
La clase base para todos los objetos que tienen las propiedades de dependencia, las dependency properties únicamente se usar para definir las propiedades de los controles de interfaz de usuario y de los objetos de negocio que interactúan con la UI
System.Windows.Media.Visual
Esta clase se encarga del renderizado de la UI, del clipping, calculo del recuadro de dibujado, transformaciones y coordenadas. Es una clase muy importante en WPF, ya que cualquier clase que se tenga que renderizar debe heredar de ella.
System.Windows.UIElement
Maneja tres elementos importantes el layaout, los eventos y el input (eventos de teclado y ratón)
System.Windows.FrameworkElement
Es una clase fundamental dentro de WPF , implementa miembros de la clase UIElement y define los estados de Measure y Arrange, ademas se encarga del enlace a datos, estilos, animaciones, define los eventos del cliclo de vida del objeto.
Por debajo de Panel están los contenedores que viene por defecto en WPF que iremos viendo en siguiente posts
- Canvas
- Grid
- StackPanel
- WrapPanel
- DockPanel
- ViewBox
Además de los que viene por defecto dentro de WPF nosotros podremos crear nuestros propios contenedores con su compartimiento, veremos algún ejemplo de ello