通过Separator.Step可以设置网格线的隔,但网格线总是从轴的MinValue画起。有时,有这种需求,如要,网格线从零开始每限5画一条,而轴的MinValue必须要为-2,这时应该怎么处理呢?
查看了一下源码,找到解决办法,在文件AxisCore.cs中,看一下函数PrepareChart,代码如下:
internal virtual CoreMargin PrepareChart(AxisOrientation source, ChartCore chart)
{
if (!(Math.Abs(TopLimit - BotLimit) > S * .01) || !ShowLabels) return new CoreMargin();
CalculateSeparator(chart, source);
var f = GetFormatter();
var currentMargin = new CoreMargin();
var tolerance = S / 10;
InitializeGarbageCollector();
var m = !double.IsNaN(View.BarUnit)
? View.BarUnit
: (!double.IsNaN(View.Unit)
? View.Unit
: Magnitude);
var u = !double.IsNaN(View.BarUnit)
? View.BarUnit
: (!double.IsNaN(View.Unit)
? View.Unit
: 1);
if (TopLimit <= 0 && BotLimit < 0)
{
var l = TopLimit - (EvaluatesUnitWidth ? u : 0);
LastSeparator = l;
for (var i = l; i >= Math.Truncate(BotLimit / m) * m; i -= S)
{
FirstSeparator = i;
DrawSeparator(i, tolerance, currentMargin, f, source);
}
}
else
{
var l = Math.Truncate(BotLimit / m) * m;
FirstSeparator = l;
for (var i = l; i <= TopLimit - (EvaluatesUnitWidth ? u : 0); i += S)
{
LastSeparator = i;
DrawSeparator(i, tolerance, currentMargin, f, source);
}
}
return currentMargin;
}
分析红色部分代码可知,我们可以设置轴的Unit来解决此问题。如,我们可以如下设置Y轴
<lvc:CartesianChart.AxisY>
<lvc:Axis IsMerged="False" Foreground="Red" Unit="5" BarUnit="5" MinValue="-2" MaxValue="22">
<lvc:Axis.Separator>
<lvc:Separator StrokeThickness="1.5" Step="5" StrokeDashArray="4">
<lvc:Separator.Stroke>
<SolidColorBrush Color="#404F56" />
</lvc:Separator.Stroke>
</lvc:Separator>
</lvc:Axis.Separator>
</lvc:Axis>
</lvc:CartesianChart.AxisY>
效果如下:
记录一下解决问题的过程,希望对大家有所帮助,继续搬砖!