形状元素能提供一种便利的方式与图形一起工作,在一些情形中,添加表示绘图的元素到UI树中,可 能是比它的价值更加麻烦。你的数据可能被构造以一种易于编写代码的方式——简单地表现一系列基于数 据的绘图操作,而不是构造一棵对象树。
WPF提供一个“可视化层”API,作为一个对形状元素较低级别的折中。(实际上,形状元素全都在可 视化层得顶部被实现。)这个API使我们编写按需生成的代码。
可视化是一个可见的对象。WPF应用程序的外观是将它所有的可视化组合到屏幕上形成的。由于WPF生 成在在可视化层的顶级,每个元素都是可视化的。FrameworkElement基类间接派生于Visual。在可视化层 编程,简单地解决了创建一个可视化和编写代码告诉WPF我们想要在可视化中显示什么。
即使在这个低的级别,WPF的表现非常不同于Win32。图形加速的方式是托管的,这意味着你的按需生 成的代码很少被调用——少于在经典Windows应用程序中。
7.5.1 按需生成
按需生成的关键定制为OnRender方法。这个方法被WPF调用在它需要你的组件生成它的外观时。(这是 内嵌形状的类生成它们自身的方式。)
OnRender虚方法定义在OnDemandVisual类。大多数元素都间接的通过FrameworkElement派生于此,这 就增加了核心样式如外观和输入处理。
示例7-47显示了一个字定义的元素,覆写了OnRender。
示例7-47
public class CustomRender : FrameworkElement
{
protected override void OnRender(DrawingContext drawingContext)
{
Debug.WriteLine("OnRender");
base.OnRender (drawingContext);
drawingContext.DrawRectangle(Brushes.Red, null, new Rect(0, 0, 100, 50));
FormattedText text = new FormattedText("Hello, world",
CultureInfo.CurrentUICulture, FlowDirection.LeftToRightThenTopToBottom,
new Typeface("Verdana"), 24, Brushes.Black);
drawingContext.DrawText(text, new Point(3, 3));
}
}