C# 如何用两种不同的颜色填充两系列样条曲线或直线之间的区域?

C# 如何用两种不同的颜色填充两系列样条曲线或直线之间的区域?,c#,winforms,charts,C#,Winforms,Charts,我有一张这样的图表: 我想在水平系列上方填充样条线区域,绿色在水平系列下方,红色在下面,如下图所示: 我尝试了中的代码,但它只会帮助我填充一种颜色:/asPaintEvent我使用: private void dgv_Paint(object sender, PaintEventArgs e){ // short references: Axis ax = dgv.ChartAreas[0].AxisX; Axis ay = dgv.ChartAreas[0].AxisY; // now

我有一张这样的图表:

我想在水平系列上方填充样条线区域,绿色在水平系列下方,红色在下面,如下图所示:

我尝试了中的代码,但它只会帮助我填充一种颜色:/as
PaintEvent
我使用:

private void dgv_Paint(object sender, PaintEventArgs e){

// short references:
Axis ax = dgv.ChartAreas[0].AxisX;
Axis ay = dgv.ChartAreas[0].AxisY;

// now we convert all values to pixels
List<PointF> points1 =  dgv.Series[0].Points.Select(x=>
    new PointF((float)ax.ValueToPixelPosition(x.XValue), 
               (float)ay.ValueToPixelPosition(x.YValues[0]))).ToList();

List<PointF> points2 =  dgv.Series[1].Points.Select(x=>
    new PointF((float)ax.ValueToPixelPosition(x.XValue), 
               (float)ay.ValueToPixelPosition(x.YValues[0]))).ToList();

// one list forward, the other backward:
points2.Reverse();

GraphicsPath gp = new GraphicsPath();
gp.FillMode = FillMode.Winding;  // the right fillmode

// it will work fine with either Splines or Lines:
if (dgv.Series[0].ChartType == SeriesChartType.Spline )   gp.AddCurve(points1.ToArray());
else gp.AddLines(points1.ToArray());
if (dgv.Series[1].ChartType == SeriesChartType.Spline) gp.AddCurve(points2.ToArray());
else gp.AddLines(points2.ToArray()); 

// pick your own color, maybe a mix of the Series colors..
using (SolidBrush brush = new SolidBrush(Color.FromArgb(66, Color.DarkCyan)))
    e.Graphics.FillPath(brush, gp);
gp.Dispose();}    
private void dgv_Paint(对象发送器,PaintEventArgs e){
//简短参考:
Axis ax=dgv.ChartAreas[0].AxisX;
ay轴=dgv.ChartAreas[0]。Axis;
//现在我们将所有值转换为像素
列表点1=dgv.Series[0]。点。选择(x=>
新点F((浮动)最大值像素位置(x.x值),
(float)ay.ValueToPixelPosition(x.YValues[0])).ToList();
列表点2=dgv.Series[1]。点。选择(x=>
新点F((浮动)最大值像素位置(x.x值),
(float)ay.ValueToPixelPosition(x.YValues[0])).ToList();
//一个列表向前,另一个列表向后:
点2.Reverse();
GraphicsPath gp=新的GraphicsPath();
gp.FillMode=FillMode.Winding;//右FillMode
//它可以与样条曲线或直线配合使用:
if(dgv.Series[0].ChartType==serieChartType.Spline)gp.AddCurve(points1.ToArray());
else gp.AddLines(points1.ToArray());
if(dgv.Series[1].ChartType==serieChartType.Spline)gp.AddCurve(points2.ToArray());
else gp.AddLines(points2.ToArray());
//选择您自己的颜色,也许是系列颜色的混合。。
使用(SolidBrush笔刷=新的SolidBrush(Color.FromArgb(66,Color.DarkCyan)))
e、 图形。填充路径(笔刷,gp);
gp.Dispose();}

也许有人给了我一个合适的提示…

你也发现了吗?jap,这也适用于一种颜色,与示例完全相同。但是,当我从您的示例中复制代码两次,并将运算符从“>”更改为“>”时,我不明白如何为horizontalannotation:”下面的第二种颜色编辑它“我确实会调用
getpath
两次,添加一个bool来切换,从而得到两个列表。然后为每个列表运行循环。我觉得还不错。@TaW:很好的提示…这很好:)你也发现了吗?jap,这对一种颜色也很好,就像这个例子一样。但是,当我从您的示例中复制代码两次,并将运算符从“>”更改为“>”时,我不明白如何为horizontalannotation:”下面的第二种颜色编辑它“我确实会调用
getpath
两次,添加一个bool来切换,从而得到两个列表。然后为每个列表运行循环。我觉得还不错。@TaW:很好的提示……这很好:)