在前面的文章里面提到了如何使用ItemsControl编写一个直方图控件(还没有写完,今天因为有急用就先写线状图的编写方法了),因此在阅读这篇文章之前,推荐先阅读下面几篇文章:
4. 使用ListBox控件来实现直方图控件(四)
5. 使用ListBox控件来实现直方图控件(五)
按照在(三)里面介绍过的方法 ,程序是把直方图后面的数据转换成矩形的高度,对于线状图来说,那就是把线状图后面的数据转化成折线上点的高度就可以了。因此我们的Converter可以复用直方图控件里面的Converter:
internal class ChartValueToHeightConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
// 复用直方图控件里面的Converter唯一的问题是,当时我在Converter函数里面
// 硬编码成Histogram类型了,所以这里我只好暂时先将它改成LineChart类型。
// 如果要做一个通过的Converter的话,问题也不是很大,只要把下面用到的TickLabelHeight
// Maximum, Minimum属性都放在ChartBase类里面就好了。
LineChart chart =
((ObjectDataProvider)parameter).ObjectInstance as LineChart;
return (chart.ActualHeight - chart.TickLabelHeight) * 0.9 * (double)value
/ (chart.Maximum - chart.Minimum);
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
而ItemsControl的ItemTemplate换成下面这个DataTemplate就可以把点画出来了:
<Grid x:Name="ChartArea" Width="20" VerticalAlignment="Bottom">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="{ Binding RelativeSource