Рисование GraphObj в элементе управления Zedgraph

#c# #winforms #zedgraph

#c# #winforms #zedgraph

Вопрос:

У меня есть элемент управления zedgraph, где я получил базовую линейную диаграмму синусоидальной и косинусоидальной волны (из учебника)

Я пытаюсь добавить BoxObj к кривой, нажав на нее (код ниже), и я вижу, что BoxObj добавлен в GraphObjList, но на самом деле ничего не нарисовано. Может ли это быть местоположение, которое я указываю объекту?

      //This works
     void zedGraphControl1_Click(object sender, EventArgs e)
        {
            Point p = (e as MouseEventArgs).Location;
            CurveItem nearestCurve;
            int index;

            this.zedGraphControl1.GraphPane.FindNearestPoint(new PointF(p.X, p.Y), out nearestCurve, out index);
            //Check for null when no curve clicked
            if (nearestCurve == null)
                return;

            BoxObj box = new BoxObj(nearestCurve[index].X, nearestCurve[index].Y, 1, 0.1, Color.Black,Color.Red);
            box.IsVisible = true;
            box.Location.CoordinateFrame = CoordType.AxisXYScale;

            box.ZOrder = ZOrder.A_InFront;
            zedGraphControl1.GraphPane.GraphObjList.Add(box);


            zedGraphControl1.Invalidate();
        }
  

Вот полное создание графика

 public void CreateGraph(zedGraph ZedGraphControl)
{
    // Lets generate sine and cosine wave
    double[] x = new double[100];
    double[] y = new double[100];
    double[] z = new double[100];

    for (int i = 0; i < x.Length; i  )
    {
        x[i] = i;
        y[i] = Math.Sin(0.3 * x[i]);
        z[i] = Math.Cos(0.3 * x[i]);
    }

    // This is to remove all plots
    zedGraph.GraphPane.CurveList.Clear();

    // GraphPane object holds one or more Curve objects (or plots)
    GraphPane myPane = zedGraph.GraphPane;

    // PointPairList holds the data for plotting, X and Y arrays 
    PointPairList spl1 = new PointPairList(x, y);
    PointPairList spl2 = new PointPairList(x, z);

    // Add cruves to myPane object
    LineItem myCurve1 = myPane.AddCurve("Sine Wave", spl1, Color.Blue, SymbolType.None);
    LineItem myCurve2 = myPane.AddCurve("Cosine Wave", spl2, Color.Red, SymbolType.None);

    myCurve1.Line.Width = 3.0F;
    myCurve2.Line.Width = 3.0F;
    myPane.Title.Text = "My First Plot";

    // I add all three functions just to be sure it refeshes the plot.   
    zedGraph.AxisChange();
    zedGraph.Invalidate();
    zedGraph.Refresh();
}
  

Окружающая среда:
MS Visual Studio 2010 и .NET Framework 4.0 в Windows XP

Ответ №1:

Вы правы, местоположение неверно. Событие щелчка дает вам координаты отображения, но конструктору BoxObj нужны либо единицы измерения вашей оси, либо доля прямоугольника диаграммы, в зависимости от типа координат вашего BoxObj.
Итак, вам нужно решить, какой тип координат вам удобнее, преобразовать event-location в этот тип, а также назначить CoordType вашему BoxObj, например:

 box.Location.CoordinateFrame = CoordType.XScaleYChartFraction;
  

РЕДАКТИРОВАТЬ: для тестирования вы можете попробовать следующее, и поле должно быть в середине вашей диаграммы:

 BoxObj box = new BoxObj(0.5, 0.5, 40, 40, Color.Black,Color.Red);
box.Location.CoordinateFrame = CoordType.ChartFraction;
  

Комментарии:

1. Большое спасибо. Я заставил его работать. CoordType.AxisXYScale выполнил свою работу и получил правильные X и Y из nearestCurve[index]