Показать координаты точки графика при наведении

161
16 мая 2019, 16:20

есть график функции типа chart. Необходимо написать код, что бы по наведению мышки на точку графика, показывались координаты точки.

Реализация вывода графика :

int x = 0; 
for (double i = -Period; i <= Period; i += step) { 
    chart.Visible = true;
    chart.Series[0].ChartType = SeriesChartType.Spline; 
    mas_MyGraphic5[x] = FuncForGraphic5(i); 
    chart5.Series[0].Points.AddXY(i, FuncForGraphic5(i)); 
    x++;
} 
Answer 1

Предлагаю установить следующее значение свойства Series.ToolTip:

chart.Series[0].ToolTip = "X = #VALX, Y = #VALY";

В этом случае никакого дополнительного кода писать не придется.

Еще можно подписаться на событие Chart.GetToolTipText, и, используя передаваемый в обработчик экземпляр класса ToolTipEventArgs, вычислять и выводить в ToolTip что заблагорассудится.

chart.GetToolTipText += chart_GetToolTipText;

Обработчик:

private void chart_GetToolTipText(object sender, ToolTipEventArgs e)
{
    // Если текст в подсказке уже есть, то ничего не меняем.
    if (!String.IsNullOrWhiteSpace(e.Text))
        return;
    Console.WriteLine(e.HitTestResult.ChartElementType);
    switch (e.HitTestResult.ChartElementType)
    {
        case ChartElementType.DataPoint:
        case ChartElementType.DataPointLabel:
        case ChartElementType.Gridlines:
        case ChartElementType.Axis:
        case ChartElementType.TickMarks:
        case ChartElementType.PlottingArea:
            // Первый ChartArea
            var area = chart.ChartAreas[0];
            // Его относительные координаты (в процентах от размеров Chart)
            var areaPosition = area.Position;
            // Переводим в абсолютные
            var areaRect = new RectangleF(areaPosition.X * chart.Width / 100, areaPosition.Y * chart.Height / 100,
                areaPosition.Width * chart.Width / 100, areaPosition.Height * chart.Height / 100);
            // Область построения (в процентах от размеров area)
            var innerPlot = area.InnerPlotPosition;
            double x = area.AxisX.Minimum +
                        (area.AxisX.Maximum - area.AxisX.Minimum) * (e.X - areaRect.Left - innerPlot.X * areaRect.Width / 100) /
                        (innerPlot.Width * areaRect.Width / 100);
            double y = area.AxisY.Maximum -
                        (area.AxisY.Maximum - area.AxisY.Minimum) * (e.Y - areaRect.Top - innerPlot.Y * areaRect.Height / 100) /
                        (innerPlot.Height * areaRect.Height / 100);
            Console.WriteLine("{0:F2} {1:F2}", x, y);
            e.Text = String.Format("{0:F2} {1:F2}", x, y);
            break;
    }
}

Несмотря на то, что координаты вычисляются верно и засылаются в e.Text, лично у меня ToolTip отображается далеко не всегда. Поэтому для верности я печатаю их в консоль. А вы вместо этого можете их отображать в каком-нибудь контроле.

READ ALSO
C# SendMessage отправку двух языков

C# SendMessage отправку двух языков

Нужно чтобы программа брала из textbox текст и отправляла, по нажатию кнопки, в то место, где грубо говоря ее вставят, будь то строчка в браузере...

197
Вращение PolygonCollider2D

Вращение PolygonCollider2D

Столкнулся с проблемойСуть: создаю двумя кликами объект из префаба

149