如何让用户在创建MSChart的注解?

问题描述 投票:2回答:1

如何创建上的运行的注释,你如何让最终用户位置与Annotation.BeginPlacement()?我试着这样做多种方式,但不能让它的工作。它应使自己在实时BeginPlacement()被调用后。

关于这个问题的单证是几乎没有 - 而且大多没有 - 所以我没能找到这个问题的任何帮助。

我到目前为止已经试过,是创建一个注释,并用AnchorX / Y放置,都允许 - 标志设置为true,并呼吁BeginPlacement(当鼠标移动),但无法看到注释,同时将它也不会去在它的相应位置。例如,LineAnnotation开始在正确的位置,但并没有结束,我离开它。当我这样从我的ChartAreas {0,0}开始移动,它会撞到终点。

我想知道的,是何时以及如何使用可用这些工具?我所要做的,就是让用户画一个图上的注释和工具分析图表时使用。

c# charts annotations mschart
1个回答
2
投票

你需要计算合适的岗位。请记住,鼠标移动不会给你位置(百分比)或值(数据),但像素。您可以使用各种轴功能改造他们。据官方统计,他们只在xxxPaint活动中起作用,但在鼠标事件他们也工作得很好。

更新:有两种方法可以做到锚固:

  • 或者通过使用“位置”,即百分比或“价值”,即数据值。

这里是第1类的一个示例:

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并设置IsSizeAlwaysRelativefalse。然后,我们可以计算出锚和大小值:

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)
© www.soinside.com 2019 - 2024. All rights reserved.