Dibujo fuera de pantalla

En ocasiones, las aplicaciones necesitan dibujar gráficos en un destino, donde ese destino no está pensado para la presentación inmediata. Este tipo de dibujo a veces se denomina "representación fuera de pantalla" o "dibujo en una textura". Esto resulta útil cuando, por ejemplo, la salida de una aplicación de una operación de dibujo se guarda en un archivo, se devuelve como una matriz de píxeles o se usa como entrada para una operación posterior.

Win2D admite estos escenarios y se facilitan con CanvasRenderTarget.

CanvasRenderTargetCanvasBitmapextiende y tiene el método CreateDrawingSession(). Use CreateDrawingSession para dibujar contenido gráfico en un CanvasRenderTarget. Por ejemplo:

CanvasDevice device = CanvasDevice.GetSharedDevice();
CanvasRenderTarget offscreen = new CanvasRenderTarget(device, width, height, 96);

using (CanvasDrawingSession ds = offscreen.CreateDrawingSession())
{
    ds.Clear(Colors.Black);
    ds.DrawRectangle(100, 200, 5, 6, Colors.Red);
}

Tenga en cuenta que hay una llamada de método a Clear. Sin esto, el mapa de bits se inicializará con contenido no definido. Las sesiones de dibujo creadas a través CanvasRenderTarget son diferentes de las creadas en los controles XAML de Win2D, en términos del Clear comportamiento. Win2D siempre borra automáticamente los controles cuando se crea una sesión de dibujo. CanvasRenderTargets no. De este modo, las aplicaciones tienen la capacidad de realizar cambios incrementales en CanvasRenderTarget-s y evitar volver a dibujar una escena completa cada vez.

Para dibujar un objeto CanvasRenderTarget en otra sesión de dibujo, simplemente use DrawImage(ICanvasImage) o una de sus sobrecargas. Por ejemplo:

void canvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)
{
    args.DrawingSession.DrawImage(offscreen, 23, 34);
}

O bien, para usar un CanvasRenderTarget elemento como entrada para un efecto, páselo donde el efecto espera usar como IGraphicsEffectSource origen. Por ejemplo:

GaussianBlurEffect blurEffect = new GaussianBlurEffect()
{
    Source = offscreen,
    BlurAmount = 3.0f
};

Una aplicación puede cerrarse y volver a abrir sesiones de dibujo de forma CanvasRenderTarget arbitraria muchas veces.

Las operaciones de dibujo no se confirman en CanvasRenderTarget hasta que se elimina el objeto de sesión de dibujo. En C#, un using bloque puede organizarlo.

Vale la pena señalar que CanvasRenderTarget no es un control XAML y no implica el árbol XAML en absoluto. Es adecuado para aplicaciones XAML y no basadas en XAML.