Con un sistema ya definido, el paso siguiente consiste en conseguir que se dibujen los píxeles en la pantalla.
La clase Visual permite compilar un árbol de objetos visuales, cada uno de los cuales puede contener instrucciones de dibujo y metadatos sobre cómo presentar esas instrucciones (recorte, transformación, etc.).
Visual
está diseñado para ser sumamente ligero y flexible, por lo que la mayoría de las características no tienen ninguna exposición en la API pública y dependen casi exclusivamente de funciones de devolución de llamada protegidas.
En realidad, Visual es el punto de entrada al sistema de composición de WPF.
Visual
es el punto de conexión entre estos dos subsistemas, la API administrada y el milcore no administrado.
WPF muestra los datos recorriendo las estructuras de datos no administradas de cuya administración se encarga milcore.
Estas estructuras, denominadas nodos de composición, representan un árbol de presentación jerárquica con instrucciones de representación en cada nodo. Sólo se puede tener acceso a este árbol, mostrado en el lado derecho de la ilustración siguiente, a través de un protocolo de mensajería.
Al programar WPF, se crean los elementos Visual, así como los tipos derivados, que se comunican internamente con el árbol de composición a través de este protocolo de mensajería.
Cada elemento Visual de WPF puede crear uno, ninguno o varios nodos de composición.
Conviene observar aquí un detalle arquitectónico muy importante, y es que el árbol completo de objetos visuales e instrucciones de dibujo se guarda en la memoria caché.
Usando terminología de gráficos, WPF utiliza un sistema de representación retenido. Esto permite al sistema volver a dibujar con frecuencias de actualización altas sin que el sistema de composición bloquee las devoluciones de llamada al código del usuario. Esto ayuda a evitar la sensación de que la aplicación no responde.
Otro detalle importante que no es muy evidente en el diagrama es la forma en la que el sistema realiza realmente la composición.
En User32 y GDI, el sistema se basa en un método de recorte de modo inmediato.
Cuando es necesario representar un componente, el sistema establece un límite de recorte en cuyo exterior no permite al componente tocar los píxeles y, a continuación, solicita a éste que pinte los píxeles en ese cuadro. Este método funciona muy bien en sistemas con restricciones de memoria, ya que cuando algo cambia sólo se debe modificar el componente afectado; nunca hay dos componentes que afecten al color de un mismo píxel.
WPF utiliza un modelo de representación "algoritmo de pintor".
Esto significa que, en lugar de recortar cada componente, se solicita a éste que efectúe la representación desde la parte trasera hacia la parte delantera de la imagen. Esto permite a cada componente pintar sobre la imagen generada por el componente anterior. La ventaja de este modelo es que permite tener formas complejas parcialmente transparentes. Con el moderno hardware gráfico actual, este modelo es relativamente rápido (lo que no ocurría cuando se crearon User32/ GDI).
Como se ha mencionado previamente, la filosofía básica de WPF es adoptar un modelo de programación más declarativo y centrado en las propiedades.
En el sistema visual, esto se pone de manifiesto en un par de lugares interesantes.
En primer lugar, si piensa en el sistema de gráficos de modo retenido, éste se está alejando de un modelo de tipo DrawLine/DrawLine imperativo hacia un modelo orientado a datos, new Line()/new Line().
Esta migración hacia la representación controlada por datos permite expresar operaciones complejas en las instrucciones de dibujo mediante propiedades. Los tipos que se derivan de Drawing son el modelo de objetos para la representación.
En segundo lugar, si evalúa el sistema de animación, verá que es declarativo casi por completo.
En lugar de exigir al programador que calcule la ubicación o el color siguiente, las animaciones pueden expresarse como un conjunto de propiedades en un objeto de animación. Estas animaciones permitirán expresar la intención del programador o del diseñador (mueva este botón de aquí a allí en 5 segundos) y el sistema podrá determinar la manera más eficaz de lograrlo.