C# 如何将多段线批注与ms图表中的图形点对齐
我已经在图形控件中添加了多段线注释。但它在Addline()方法中的给定数据点中没有正确对齐C# 如何将多段线批注与ms图表中的图形点对齐,c#,winforms,annotations,mschart,C#,Winforms,Annotations,Mschart,我已经在图形控件中添加了多段线注释。但它在Addline()方法中的给定数据点中没有正确对齐 注释非常复杂,锚定它们也非常复杂 它的开始相当简单:要锚定注释,需要将其锚定数据点设置为现有的数据点 这一行没有这样的功能: annotation.AnchorDataPoint = new DataPoint(this.chart1.Series[0]); 因为新创建的数据点为空。已经添加了它,并且它的值为(0d,0d),但是您可能希望将注释与实际数据点对齐,可能如下所示: annotation.A
注释
非常复杂,锚定它们也非常复杂
它的开始相当简单:要锚定注释
,需要将其锚定数据点
设置为现有的数据点
这一行没有这样的功能:
annotation.AnchorDataPoint = new DataPoint(this.chart1.Series[0]);
因为新创建的数据点
为空。已经添加了它,并且它的值为(0d,0d)
,但是您可能希望将注释与实际数据点对齐,可能如下所示:
annotation.AnchorDataPoint = chart1.Series[0].Points[someIndex];
但是还有更多的方法:实际上有两种方法可以锚定注释
:
- 将其锚定到
数据点
或
- 使用固定的
AnchorX
和AnchorY
值锚定它
(然后也可以将它们设置为固定的X和Y值。)
你的代码实际上两者都做但:定位坐标优先于定位到数据点
这很好,因为您可以将它们组合在一起,首先锚定到数据点
,然后将一个坐标锚定到一个固定值:例如,x值保留在该点上,但y值可能始终为0
还请注意,您只向多段线添加了一条线,而不是从(0,0)
开始,而是从(10,20)
开始,而可能离锚点很远
然后存在多段线本身的大小和对齐问题
它的大小声称以像素为单位。这是胡说八道。相反,它以两个相应的轴的值单位给出。当您调整大小时可以看到这一点图表注释也将调整大小;看截图
现在对于图形SPATH
及其点:它们以注释的大小
的百分比给出。要了解这一点,请添加一个包含整个区域的测试注释路径:
annotation.GraphicsPath.AddRectangle(new Rectangle(0, 0, 100, 100));
以下是我们得到的屏幕截图:
正如您所看到的,最符合逻辑的对齐方式是左上
,将该行转换为(0,0)
后,它将向右插入该点
请注意,我添加了第二个系列
,以突出锚点数据点还要注意的是,注释
大小是一个正方形(10,10)
与整个图表一起水平拉伸
这是我使用的完整代码:
PolylineAnnotation annotation = new PolylineAnnotation();
annotation.AxisX = chart1.ChartAreas[0].AxisX;
annotation.AxisY = chart1.ChartAreas[0].AxisY;
annotation.Height = 10;
annotation.Width = 10;
annotation.LineWidth = 3;
annotation.StartCap = LineAnchorCapStyle.None;
annotation.EndCap = LineAnchorCapStyle.None;
annotation.Alignment = ContentAlignment.TopLeft;
annotation.AnchorAlignment = ContentAlignment.TopLeft;
annotation.X = annotation.Y = annotation.AnchorX = annotation.AnchorY = double.NaN;
DataPoint dp = chart1.Series[0].Points[33];
annotation.AnchorDataPoint = dp;
chart1.Series[1].Points.AddXY(dp.XValue, dp.YValues[0]); // my red points series
annotation.AllowAnchorMoving = true;
annotation.AllowMoving = true;
annotation.AllowPathEditing = true;
annotation.AllowResizing = true;
annotation.AllowSelecting = true;
annotation.GraphicsPath.AddLine(10, 20, 30, 30);
Rectangle r = new Rectangle(0, 0, 100, 100);
annotation.GraphicsPath.AddRectangle(r);
chart1.Annotations.Add(annotation);
还要注意的是,为了确保没有错误的锚点处于活动状态,我将X/Y
和AnchorX/Y
值设置为double.NaN
,以重置它们!这里并不需要这样做,因为这些都是默认设置
注释
非常复杂,锚定它们也非常复杂
它的开始相当简单:要锚定注释
,需要将其锚定数据点
设置为现有的数据点
这一行没有这样的功能:
annotation.AnchorDataPoint = new DataPoint(this.chart1.Series[0]);
因为新创建的数据点
为空。已经添加了它,并且它的值为(0d,0d)
,但是您可能希望将注释与实际数据点对齐,可能如下所示:
annotation.AnchorDataPoint = chart1.Series[0].Points[someIndex];
但是还有更多的方法:实际上有两种方法可以锚定注释
:
- 将其锚定到
数据点
或
- 使用固定的
AnchorX
和AnchorY
值锚定它
(然后也可以将它们设置为固定的X和Y值。)
你的代码实际上两者都做但:定位坐标优先于定位到数据点
这很好,因为您可以将它们组合在一起,首先锚定到数据点
,然后将一个坐标锚定到一个固定值:例如,x值保留在该点上,但y值可能始终为0
还请注意,您只向多段线添加了一条线,而不是从(0,0)
开始,而是从(10,20)
开始,而可能离锚点很远
然后存在多段线本身的大小和对齐问题
它的大小声称以像素为单位。这是胡说八道。相反,它以两个相应的轴的值单位给出。当您调整大小时可以看到这一点图表注释也将调整大小;看截图
现在对于图形SPATH
及其点:它们以注释的大小
的百分比给出。要了解这一点,请添加一个包含整个区域的测试注释路径:
annotation.GraphicsPath.AddRectangle(new Rectangle(0, 0, 100, 100));
以下是我们得到的屏幕截图:
正如您所看到的,最符合逻辑的对齐方式是左上
,将该行转换为(0,0)
后,它将向右插入该点
请注意,我添加了第二个系列
,以突出锚点数据点还请注意,注释
大小是一个正方形(10,10)
是水平拉伸