如何在ms图表中相对于图形点对齐折线注释

时间:2017-04-14 06:31:15

标签: c# winforms annotations mschart

我已将Polyline注释添加到图形控件中。但是在Addline()方法中给定的数据点没有正确对齐。

        PolylineAnnotation annotation = new PolylineAnnotation();
        annotation.AxisX = chart1.ChartAreas[0].AxisX;
        annotation.AxisY = chart1.ChartAreas[0].AxisY;
        annotation.AnchorX = 0;
        annotation.AnchorY = 0;
        annotation.Height = 30;
        annotation.Width = -30;
        annotation.LineWidth = 3;
        annotation.StartCap = LineAnchorCapStyle.None;
        annotation.EndCap = LineAnchorCapStyle.None;
        annotation.Alignment = ContentAlignment.BottomLeft;
        annotation.AnchorAlignment = ContentAlignment.BottomRight;
        annotation.AnchorDataPoint = new DataPoint(this.chart1.Series[0]);

        annotation.AllowAnchorMoving = true;
        annotation.AllowMoving = true;
        annotation.AllowPathEditing = true;
        annotation.AllowResizing = true;
        annotation.AllowSelecting = true;

        annotation.GraphicsPath.AddLine(10, 20, 30, 30);
        chart1.Annotations.Add(annotation);

enter image description here

1 个答案:

答案 0 :(得分:0)

Annotations 复杂,并将它们锚定起来。

开始相当简单:要锚定Annotation,您需要将其AnchorDataPoint设置为现有 DataPoint。< / p>

这一行没有那样:

annotation.AnchorDataPoint = new DataPoint(this.chart1.Series[0]);

因为新创建的DataPoint为空。它已被添加,其值为(0d, 0d),但您可能希望Annotation真实 DataPoint保持一致,可能是这样的..:

annotation.AnchorDataPoint = chart1.Series[0].Points[someIndex];

但还有更多:实际上有两种方法来锚定Annotation

  • 将其锚定到DataPoint
  • 使用固定的AnchorXAnchorY值来锚定它。

(然后你也可以将它们设置为固定的X和Y值。)

你的代码实际上都做到了! :锚定坐标需要优先级而不是锚定到DataPoint

这很好,因为你可以将它们和第一个锚点组合到一个DataPoint,然后将一个的坐标锚定到一个固定的值:比如,x值保持在点但是y值可能始终为0 ..

另请注意,您只需在折线上添加一条线,而不是在(0,0)处开始,而是在(10,20)开始,可能远离锚..

然后折线本身存在尺寸对齐的问题!

它的大小以像素为单位给出MSDN 声明。这是废话。相反,它是在两个value的{​​{1}}单位中给出的。当您调整大小 Axes Chart也会调整大小时,您可以看到此消息;看截图!

对于Annotation及其要点,

现在:这些是GraphicsPath的{​​{1}}的百分比。为了感受这一点,添加一个包含整个区域的测试注释路径:

Size

以下是我们所拥有的截图:

enter image description here

正如您所看到的那样,最合乎逻辑的对齐方式是Annotation,并且在将该行转换为 annotation.GraphicsPath.AddRectangle(new Rectangle(0, 0, 100, 100)); 后,它会直接进入该点。

请注意,我添加了第二个TopLeft以使锚点数据突出显示... - 另请注意,(0,0)尺寸为正方形 {{1与整个图表一起水平拉伸

这是我使用的完整代码:

Series

另请注意,为了确保没有错误的锚点处于活动状态,我将<{>}重置 Annotation(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); !这里并不是真的需要,因为这些都是默认值。

Here btw is another post on the topic!