在傳統的Windows窗體編程中,如果我們需要打造一些比較個性化的控件,那麼我們常常需要自定義控件的繪制(重寫OnPaint等),即需要經常用到Graphics對象。而在WPF中,我們可以使用Xaml輕松編寫出很有特色的界面元素,似乎與以前的以前利用Graphics對象手寫代碼繪制控件的日子越來越遠了。其實在WPF中,如果我們需要低級別的自定義繪制同樣是可以的,那麼我們就需要一個名DrawingContext的類。與OnPaint方法相對應的是OnRender方法(當然,你也可以在其他地方進行繪制)。
在UIElement.OnRender( DrawingContext drawingContext )方法中,直接提供了DrawingContext對象,我們可以利用它像以前的Graphics對象一樣進行各式各樣的繪制操作,值得注意的是一下幾點:
1,在我們的代碼中,我們不能直接調用OnRender方法,它將被系統異步調用進行布局和繪制(這與Win32不同)。
2,我們不能直接創建DrawingContext實例,但我們可以利用 DrawingGroup.Open 和DrawingVisual.RenderOpen來得到。
3,我們的繪制不是實時的,事實上我們的繪制將被保存到一個繪制指令集中被圖形系統在某個時候調用。
參考如下代碼,我們重新定義的一個Canvas的繪制:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows;
using System.Globalization;
namespace CustomPaint
{
class MyCanvas : Canvas
{
protected override void OnRender(DrawingContext dc)
{
base.OnRender(dc);
dc.DrawRectangle(Brushes.LightBlue, new Pen(Brushes.Red, 1),
new Rect(new Point(10, 10), new Size(100, 50)));
dc.DrawText(new FormattedText("my canvas", CultureInfo.CurrentCulture,
FlowDirection.LeftToRight, new Typeface("Tahoma"), 20, Brushes.Green),
new Point(50,25));
}
}
}
效果如下:
在《在WPF中自定義你的繪制(二)》中我們將更深入地闡述在WPF中如何進行自定義繪制,謝謝。