首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WPF 可視化層程式設計:OnRender、DrawingContext、指令緩存與無效化機制

     編輯:關於.NET

何時使用可視化層?

當用 Shape 元素建構視覺樹過於繁重、或資料結構適合直接發繪圖指令時,可繞過元素樹,直接在 OnRender 中按需生成繪圖指令。

OnRender 與 DrawingContext

  • 繼承 FrameworkElement → 覆寫 OnRender(DrawingContext dc)。
  • DrawingContext 提供低階繪圖操作(表 7-4):DrawRectangle、DrawEllipse、DrawGeometry、DrawText、DrawImage、DrawVideo、PushTransform/Pop、PushClip/Pop、PushOpacity/Pop、DrawGlyphRun、DrawDrawing。
  • 筆刷/鋼筆/Geometry/Drawing 物件可直接傳入,與高階 API 共用。

範例:自訂繪製元素

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));
    }
}

自訂繪製結果

WPF 指令緩存:非即時模式的關鍵差異

  • Win32/WinForms:OnPaint 頻繁被呼叫(視窗移動、遮蓋、縮放)。
  • WPF:OnRender 極少被呼叫(通常只一次)。系統緩存繪圖指令,重繪時直接重播指令,不重新執行你的程式碼。
  • 縮放/轉換不觸發 OnRender,系統直接套用矩陣轉換到緩存指令(圖 7-57:6 倍縮放銳利無鋸齒)。
  • 動畫系統同理:保留基礎指令,獨立元素變更時局部重構。

縮放不觸發 OnRender

主動觸發重繪:InvalidateVisual

若內部狀態改變需更新外觀,呼叫 InvalidateVisual() → WPF 會再次呼叫 OnRender。

配合版面配置系統

  • 覆寫 OnRender 時,通常也要覆寫 MeasureOverride、ArrangeOverride 告訴版面系統元素大小。
  • 範例置於 Canvas 故略過;若用其他 Panel 則必須實作。

效能優勢

  • 指令級緩存比位圖緩存更精細、記憶體效率更高。
  • CPU 執行指令遠快於記憶體搬移像素資料;指令緩存讓熱資料留在 CPU 快取。
  • 應用程式忙碌時 UI 仍保持完整回應(重繪不阻塞 UI 執行緒)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved