當用 Shape 元素建構視覺樹過於繁重、或資料結構適合直接發繪圖指令時,可繞過元素樹,直接在 OnRender 中按需生成繪圖指令。
FrameworkElement → 覆寫 OnRender(DrawingContext dc)。DrawingContext 提供低階繪圖操作(表 7-4):DrawRectangle、DrawEllipse、DrawGeometry、DrawText、DrawImage、DrawVideo、PushTransform/Pop、PushClip/Pop、PushOpacity/Pop、DrawGlyphRun、DrawDrawing。public class CustomRender : FrameworkElement {
protected override void OnRender(DrawingContext dc) {
Debug.WriteLine("OnRender");
base.OnRender(dc);
dc.DrawRectangle(Brushes.Red, null, new Rect(0, 0, 100, 50));
FormattedText text = new FormattedText("Hello, world",
CultureInfo.CurrentUICulture, FlowDirection.LeftToRight,
new Typeface("Verdana"), 24, Brushes.Black);
dc.DrawText(text, new Point(3, 3));
}
}

OnPaint 頻繁被呼叫(視窗移動、遮蓋、縮放)。OnRender 極少被呼叫(通常只一次)。系統緩存繪圖指令,重繪時直接重播指令,不重新執行你的程式碼。OnRender,系統直接套用矩陣轉換到緩存指令(圖 7-57:6 倍縮放銳利無鋸齒)。
若內部狀態改變需更新外觀,呼叫 InvalidateVisual() → WPF 會再次呼叫 OnRender。
OnRender 時,通常也要覆寫 MeasureOverride、ArrangeOverride 告訴版面系統元素大小。Canvas 故略過;若用其他 Panel 則必須實作。