應用程式偶爾會遇到不適合立即顯示的目標,而需要將圖形繪製到該目標。 這種繪圖有時稱為「幕後轉譯」或「繪製至紋理」。 這在一些情況中相當有用,例如將應用程式的輸出儲存到檔案、以像素陣列傳回,或用來當成後續操作的輸入。
Win2D 支援這些案例,而且透過 CanvasRenderTarget 讓處理起來更輕鬆。
CanvasRenderTarget 延伸了 CanvasBitmap,並且還有方法 CreateDrawingSession()。 使用 CreateDrawingSession 將圖形內容繪製至 CanvasRenderTarget。 例如:
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);
}
請注意,有一個方法呼叫 Clear。 如果沒有這個呼叫,點陣圖將會使用未定義的內容初始化。 透過 CanvasRenderTarget 建立的繪圖工作階段,與 Win2D XAML 控制項上建立的工作階段,在 Clear 行為上是不同的。 建立繪圖工作階段時,Win2D 一律會自動清除控制項。 CanvasRenderTargets 則不會。 如此一來,應用程式就能夠對 CanvasRenderTarget-s 進行累加變更 ,並避免每次都要重新繪製整個場景。
若要繪製 CanvasRenderTarget 到另一個繪圖工作階段,只要使用 DrawImage(ICanvasImage) 或其多載之一即可。 例如:
void canvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)
{
args.DrawingSession.DrawImage(offscreen, 23, 34);
}
或者,若要使用 CanvasRenderTarget 做為效果的輸入,則將它傳入到效果預期使用 IGraphicsEffectSource 做為來源的位置。 例如:
GaussianBlurEffect blurEffect = new GaussianBlurEffect()
{
Source = offscreen,
BlurAmount = 3.0f
};
應用程式可以任意關閉並重新開啟繪圖會話 CanvasRenderTarget 多次。
在清除繪圖工作階段物件之前,CanvasRenderTarget 不會讓繪圖操作立即生效。 在 C# 中,using 區塊可以組織此過程。
值得指出的是,CanvasRenderTarget 不是 XAML 控制項,而且根本不涉及 XAML 樹狀結構。 它適用於 XAML 和非 XAML 型應用程式。