当锚点关闭轴视图时,C#图表线注释消失

时间:2016-07-05 18:08:46

标签: c# .net visual-studio charts data-visualization

我确定这个问题有一个我不知道的简单解决方案,但无论如何我都会问。我有这段代码:

HorizontalLineAnnotation h = new HorizontalLineAnnotation();
h.AnchorX = startOfNewGraph;
h.Width = newGraphWidth;
h.AxisX = resultGraph.ChartAreas[0].AxisX;
h.AxisY = resultGraph.ChartAreas[0].AxisY;
h.IsSizeAlwaysRelative = false;
h.ClipToChartArea = resultGraph.ChartAreas[0].Name;
originalHLAAnchors.Add(h.AnchorX);
originalHLAWidths.Add(h.Width);
resultGraph.Annotations.Add(h);

我的问题是,当我的图表视图缩放到其AnchorX在视图之外的位置时,注释会消失。我想保持它,以便即使注释的两端都不在视图中,我仍然可以看到它们之间的界限。以下是我试图解决的问题:

private void resultGraph_AxisViewChanged(object sender, ViewEventArgs e)
    {

        if (e.Axis == resultGraph.ChartAreas[0].AxisX)
        {
            ResizeHorizontalAnnotations();
        }
    }

private void ResizeHorizontalAnnotations()
    {
        int count = 0;
        for (int i = 0; i < resultGraph.Annotations.Count; i++)
        {
            if (resultGraph.Annotations[i] is HorizontalLineAnnotation)
            {
                if (originalHLAAnchors[count] < resultGraph.ChartAreas[0].AxisX.ScaleView.ViewMinimum)
                {
                    resultGraph.Annotations[i].AnchorX = resultGraph.ChartAreas[0].AxisX.ScaleView.ViewMinimum + 0.0005;
                    if ((originalHLAAnchors[count] + originalHLAWidths[count]) >= resultGraph.ChartAreas[0].AxisX.ScaleView.ViewMaximum)
                    {
                        resultGraph.Annotations[i].Width = resultGraph.ChartAreas[0].AxisX.ScaleView.ViewMaximum - resultGraph.ChartAreas[0].AxisX.ScaleView.ViewMinimum;
                    }
                    else
                    {
                        resultGraph.Annotations[i].Width -= resultGraph.ChartAreas[0].AxisX.ScaleView.ViewMinimum - originalHLAAnchors[count];
                    }
                }
                else
                {
                    resultGraph.Annotations[i].AnchorX = originalHLAAnchors[count];
                    resultGraph.Annotations[i].Width = originalHLAWidths[count];
                }
                resultGraph.Annotations[i].Visible = true;
               count++;
            }
        }
        resultGraph.UpdateAnnotations();
    }

然而,这段代码似乎也没有用。当我第一次尝试时,注释没有显示,所以我向AnchorX添加了0.005,看它是否必须略微超过最小视图。这也不起作用。当我检查注释的本地值时,数字是正确的。注释要么没有正确显示,要么根本没有显示。 UpdateAnnotations()缩小视图并禁用我的注释。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

看起来Annotations直接使用AnchorX属性锚定到某个位置,或者一旦该锚点不再位于视图缩放中,就会使用AnchorDataPoint消失。

不确定这是错误还是功能,但您可以通过直接设置位置来解决问题。

因此,您应该使用h.Widthh.X属性来调整Annotation的大小和位置:

    h.X = startOfNewGraph;
    h.Width = newGraphWidth;

您没有告诉我们您如何垂直放置Annoation;也许锚定在DataPoint?或者通过设置Y属性?两者现在都应该用于放大x轴。

请注意,Annotation.XAnnotation.AnchorX都有默认值double.NaN,在图表中通常表示“自动”;在这种情况下,我猜这意味着'不适用'。

如果你设置了两个属性,我发现Annotation.X获胜。因此,将其重新设置为double.NaN会使Annotation.AnchorX再次生效。

答案 1 :(得分:0)

使用系列而不需要打扰锚点并调整.net图表注释的问题:

private void Line(Point start, Point end)
{
    chart1.Series.Add("line");
    chart1.Series["line"].ChartType = SeriesChartType.Line;
    chart1.Series["line"].Color = System.Drawing.Color.Red;
    chart1.Series["line"].Points.AddXY(start.X, start.Y);
    chart1.Series["line"].Points.AddXY(end.X, end.Y);
}