如何让用户在MSChart上创建注释?

时间:2016-10-07 07:45:37

标签: c# charts annotations mschart

如何在运行中创建注释?如何使用Annotation.BeginPlacement()启用最终用户展示位置?我试图以多种方式做到这一点,但无法让它发挥作用。它应该在调用BeginPlacement()之后实时呈现。

关于这个主题的文档几乎没有 - 而且大部分都没有 - 所以我无法找到任何帮助解决这个问题。

到目前为止我尝试过的是创建一个注释并将其放置在AnchorX / Y中,将所有Allow-flags设置为true并在鼠标移动时调用BeginPlacement(),但在放置时也看不到注释。它会相应地进入它的位置吗?例如,LineAnnotation从正确的位置开始,但不会在我离开的位置结束。当我移动它以便从我的ChartAreas {0,0}开始时,它将达到终点。

我想知道的是,何时以及如何使用这些工具?我想要做的是让用户在图表上绘制注释并在分析图表时用作工具。

1 个答案:

答案 0 :(得分:2)

您需要计算正确的位置。请记住,MouseMove不会为您提供位置(百分比)或值(数据),而是像素。您可以使用各种轴功能对它们进行变换。正式地说,他们只在xxxPaint事件中工作,但在鼠标事件期间,它们也可以正常工作。

更新:有两种方法可以进行锚定:

  • 使用“排名”,即百分比或“值”,即数据值。

以下是第一类的例子:

enter image description here

    LineAnnotation laNew = null;

    private void chart1_MouseDown(object sender, MouseEventArgs e)
    {
        if (cbx_drawAnnotation.Checked)
        {
            Axis ax = chart1.ChartAreas[0].AxisX;
            Axis ay = chart1.ChartAreas[0].AxisY;
            laNew = new LineAnnotation();
            chart1.Annotations.Add(laNew);
            double vx = ax.ValueToPosition(ax.PixelPositionToValue(e.X));
            double vy = ay.ValueToPosition(ay.PixelPositionToValue(e.Y));
            laNew.X = vx;
            laNew.Y = vy;
        }
    }


    private void chart1_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button.HasFlag(MouseButtons.Left) && cbx_drawAnnotation.Checked)
        {
            Axis ax = chart1.ChartAreas[0].AxisX;
            Axis ay = chart1.ChartAreas[0].AxisY;
            double vx = ax.ValueToPosition(ax.PixelPositionToValue(e.X))- laNew.X;
            double vy = ay.ValueToPosition(ay.PixelPositionToValue(e.Y)) - laNew.Y;
            laNew.Width =  Math.Min(100, vx);
            laNew.Height =  Math.Min(100, vy);
            laNew.LineColor = rb_green.Checked ? Color.Green : Color.Red;
            laNew.AllowMoving = true;  // optional
        }
    }

这适用于你需要以某种方式重新调整轴的方法,例如更改轴的最小值和/或最大值。

  • 如果您需要锚定到数据值

首先,我们需要将AnnotationAxes相关联,并将IsSizeAlwaysRelative设置为false。然后我们可以计算锚点和大小值:

private void chart1_MouseDown(object sender, MouseEventArgs e)
{
    if (cbx_drawAnnotation.Checked)
    {
        Axis ax = chart1.ChartAreas[0].AxisX;
        Axis ay = chart1.ChartAreas[0].AxisY;
        laNew = new LineAnnotation();
        chart1.Annotations.Add(laNew);

        laNew.IsSizeAlwaysRelative = false;

        laNew.AxisX = ax;
        laNew.AxisY = ay;

        laNew.AnchorX = ax.PixelPositionToValue(e.X);
        laNew.AnchorY = ay.PixelPositionToValue(e.Y);

        laNew.LineColor = rb_green.Checked ? Color.Green : Color.Red;
        laNew.AllowMoving = true;
    }
}


private void chart1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button.HasFlag(MouseButtons.Left) && cbx_drawAnnotation.Checked)
    {
        Axis ax = chart1.ChartAreas[0].AxisX;
        Axis ay = chart1.ChartAreas[0].AxisY;

        laNew.Width = ax.PixelPositionToValue(e.X) - laNew.AnchorX;   // values
        laNew.Height = ay.PixelPositionToValue(e.Y) - laNew.AnchorY;  
    }
}

请注意我现在可以如何缩放最大值并仍然调整图表的大小,并且注释保留在数据点中..:

enter image description here

更新:要将行限制为ChartArea,请将其添加到MouseDown事件中的定义:

 laNew.ClipToChartArea = chart1.ChartAreas[0].Name;

要防止例外离开图表,请将其添加到MouseMove中的条件..:

.. && chart1.ClientRectangle.Contains(e.Location)