C# 如何将多段线批注与ms图表中的图形点对齐

C# 如何将多段线批注与ms图表中的图形点对齐,c#,winforms,annotations,mschart,C#,Winforms,Annotations,Mschart,我已经在图形控件中添加了多段线注释。但它在Addline()方法中的给定数据点中没有正确对齐 注释非常复杂,锚定它们也非常复杂 它的开始相当简单:要锚定注释,需要将其锚定数据点设置为现有的数据点 这一行没有这样的功能: annotation.AnchorDataPoint = new DataPoint(this.chart1.Series[0]); 因为新创建的数据点为空。已经添加了它,并且它的值为(0d,0d),但是您可能希望将注释与实际数据点对齐,可能如下所示: annotation.A

我已经在图形控件中添加了多段线注释。但它在Addline()方法中的给定数据点中没有正确对齐


注释
非常复杂,锚定它们也非常复杂

它的开始相当简单:要锚定
注释
,需要将其
锚定数据点
设置为现有的
数据点

这一行没有这样的功能:

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)
水平拉伸