在WinForm中,要是想自定义一些控件,就需要重写控件的On_Paint属性,例如我写的冰墩墩,就是利用控件的On_Paint属性重新绘制的。
但是在WPF中,可以通过Xaml编写出很多特色的控件,例如geometry,pathgeometry。似乎不在需要这种重新绘制控件的操作了。其实在WPF中,如果我们需要低级别的自定义绘制同样是可以的,那么我们就需要一个名DrawingContext的类。与OnPaint方法相对应的是OnRender方法(当然,你也可以在其他地方进行绘制)。
在UIElement.OnRender( DrawingContext drawingContext )方法中,直接提供了DrawingContext 对象,我们可以利用它像以前的Graphics对象一样进行各式各样的绘制操作,值得注意的是一下几点:
1,在我们的代码中,我们不能直接调用OnRender方法,它将被系统异步调用进行布局和绘制(这与Win32不同)。
2,我们不能直接创建DrawingContext实例,但我们可以利用 DrawingGroup.Open 和DrawingVisual.RenderOpen来得到。
3,我们的绘制不是实时的,事实上我们的绘制将被保存到一个绘制指令集中被图形 系统在某个时候调用。
public class CustomCanvas:Canvas
{
protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext);
drawingContext.DrawRectangle(Brushes.LightBlue, new Pen(Brushes.Red, 1),
new Rect(new Point(100, 10), new Size(100, 50)));
drawingContext.DrawText(new FormattedText("测试绘制", CultureInfo.CurrentCulture,
FlowDirection.LeftToRight, new Typeface("Tahoma"), 20, Brushes.Green),
new Point(50, 25));
}
}
<Grid >
<local:CustomCanvas></local:CustomCanvas>
</Grid>