尽管现在涌现出了许多各种各样的高级计算机图形(包括动画和 3-D),但我认为,最重 要的永远是使用条形图、饼图和折线构建的传统图表中基本直观的数据表示形式。
虽然数据表可能看起来像是一堆杂乱的随机数字,但图形中隐藏的任何趋势或有趣的信息 比在图表中显示更易于理解。
借助 Windows Presentation Foundation (WPF) 及其基于 Web 的分支 Silverlight,我 们发现了在标记(而不是代码)中定义图形画面的优点。与代码相比,可扩展应用程序标记 语言 (XAML) 更易于更改、体验且易于作为工具使用,从而允许我们以交互方式定义我们的 画面并试用可选方法。
事实上,完全在 XAML 中定义画面非常有利,这样,WPF 编程人员可以将大量时间用于专 门编写代码,从而使 XAML 功能更强大、更灵活。这种现象我称之为“对 XAML 进行编码” ,这也是 WPF 更改应用程序开发方法的几种方式之一。
WPF 中许多功能最强大的技术都包括 ItemsControl,它是通常显示同一类型的项目集合 的基本控件。(ItemsControl 派生的一种常见控件是 ListBox,可通过它进行导航、选择和 显示。)
ItemsControl 可以包含任何类型的对象,甚至是不具有固有的文本或直观表示形式的业 务对象。神奇的组成之处是 DataTemplate(它几乎始终在 XAML 中进行定义),它基于对象 的属性为这些业务对象提供一种直观的表示形式。
在三月的期刊中,我介绍了如何使用 ItemsControl 和 DataTemplate 在 XAML 中定义条 形图和饼图。起初,我曾打算在那篇文章中介绍折线图,但折线图的重要性(和难度)使我 不得不在整个专栏中专门介绍该主题。
折线图问题
折线图实际上是分散曲线的形式 — 在水平轴和垂直轴上各有一个变量的笛卡尔坐标系统 。折线图的一个明显的区别在于图表上水平方向的值通常都是经过分类的。这些值通常是日 期或时间,也就是说,折线图通常显示变量随时间的变化情况。
另一个明显的区别在于单个数据点通过直线连接。虽然从表面上看直线是折线图画面的基 本组成部分,但实际上它是在 XAML 中绘制图表过程中的重大破坏性因素。DataTemplate 介 绍如何在 ItemsControl 中呈现每个项,但是连接这些项要求访问多个点,从理论上讲, PointCollection 随后可与 Polyline 元素结合使用。第一个重要事项是需要生成此 PointCollection,因为对折线图数据执行预处理需要自定义类。
与其他图形相比,折线图更要求多加注意坐标轴。事实上,水平轴和垂直轴本身成为其他 ItemsControl 是有用的!然后,这两个 ItemsControl 的其他 DataTemplate 可完全用于在 XAML 中定义轴刻度线和标签的格式。
总之,首先是具有以下两个属性的数据项集合:这两个属性分别对应于水平轴和垂直轴。 要在 XAML 中绘制图表,您需要从数据中获取特定的项。首先,您需要找到每个数据项对应 的点对象(用于呈现各个数据点)。还需要所有数据项的 PointCollection(连接点的直线 )和两个包含用于在 XAML 中呈现水平轴和垂直轴的充足信息的附加集合,其中包含标签数 据以及用于定位标签和刻度线的偏移量。
很显然,要计算这些 Point 对象和偏移量需要某些信息:图表的宽度和高度以及在水平 轴和垂直轴上制成图表的数据的最大值和最小值。
但这还远远不够。假设垂直轴上的最小值是 127,最大值是 232。在这种情况下,您可能 希望垂直轴实际上从 100 延长到 250,每 25 个单位一个刻度线。或者对于此特定图形,您 可能希望始终包括 0,这样垂直轴可从 0 延长到 250。又或许您希望最大值始终是 100 的 倍数,这样该值便位于 0 到 300 之间。如果这些值的范围为 -125 到 237,或许您希望 0 位于中间,因此该轴的范围可能为 -300 到 300。
可能有许多不同的策略用于确定坐标轴显示哪些值,然后这些策略会控制与各个数据项相 关联的 Point 值的计算。这些策略可能各不相同,因此提供一个“插件”选项以根据需要为 特定图表定义其他坐标轴策略非常有用。