Получить значение Form.Left точки (X, Y) в ChartControl

Мне нужно левое значение (или местоположение на экране) определенной точки в элементе управления диаграммой. В основном точка 0,0, потому что она меняется при изменении размера формы.

ваше здоровье


person Vasmares    schedule 19.10.2016    source источник
comment
если вы хотите, чтобы он менялся при изменении размера формы, вы можете изменить привязку диаграммы   -  person NotGI    schedule 19.10.2016


Ответы (2)


Предполагая, что вы имеете в виду положение DataPoint с XValue = 0 и YValue[0] = 0, вы можете использовать для этого функцию XAxis ValueToPixelPosition; вот пример, который предполагает, что вы добавили Label lbl к Controls графика и сохраните этот Label на позиции 3-го DataPoint:

private void chart1_Resize(object sender, EventArgs e)
{
    DataPoint dp = chart1.Series[0].Points[2];
    ChartArea ca = chart1.ChartAreas[0];
    Axis ax = ca.AxisX;
    Axis ay = ca.AxisY;

    int px = (int) ax.ValueToPixelPosition(dp.XValue);
    int py = (int) ay.ValueToPixelPosition(dp.YValues[0]);

    lbl.Location = new Point(px, py);
}

Обратите внимание, что эта функция, а также другие функции преобразования (PixelPositionToValue) будут работать только в событиях Pre/PostPaint или в событиях мыши. Событие Resize тоже работает.

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

введите здесь описание изображения

Значения px, py в пикселях относятся к диаграмме. Чтобы преобразовать их в точку относительно формы, вы можете использовать обычные функции преобразования PointToScreen и PointToClient.


Обновление:

Если вам действительно нужны координаты пикселей в верхнем левом углу ChartArea.InnerPlotPosition, вы можете использовать эти две функции:

RectangleF ChartAreaClientRectangle(Chart chart, ChartArea CA)
{
    RectangleF CAR = CA.Position.ToRectangleF();
    float pw = chart.ClientSize.Width / 100f;
    float ph = chart.ClientSize.Height / 100f;
    return new RectangleF(pw * CAR.X, ph * CAR.Y, pw * CAR.Width, ph * CAR.Height);
}

RectangleF InnerPlotPositionClientRectangle(Chart chart, ChartArea CA)
{
    RectangleF IPP = CA.InnerPlotPosition.ToRectangleF();
    RectangleF CArp = ChartAreaClientRectangle(chart, CA);

    float pw = CArp.Width / 100f;
    float ph = CArp.Height / 100f;

    return new RectangleF(CArp.X + pw * IPP.X, CArp.Y + ph * IPP.Y,
                            pw * IPP.Width, ph * IPP.Height);
}

Используйте его, возможно, в событии Resize следующим образом:

ChartArea ca = chart1.ChartAreas[0];
Rectangle ipr = Rectangle.Round(InnerPlotPositionClientRectangle(chart1, ca));
lbl.Location =  ipr.Location;

введите здесь описание изображения

Вы можете легко сместить его на несколько пикселей, если хотите.

person TaW    schedule 19.10.2016
comment
Привет, это в основном то, что я ищу, но я не хочу прикреплять ярлык к точке данных. Я хочу, чтобы метка была прикреплена к верхнему левому углу диаграммы. И оставаться там. Изображение : ссылка - person Vasmares; 20.10.2016
comment
Привет, я обновил ответ, чтобы показать, как прикрепить метку к верхней левой части внутренней области диаграммы. - person TaW; 20.10.2016
comment
Идеальный ответ: D Это именно то, что я искал. - person Vasmares; 20.10.2016
comment
Если вы довольны ответом, рассмотрите возможность принятия его..! - person TaW; 20.10.2016

РЕШЕНИЕ

это был код, который мне был нужен. Он удерживает метки близко к верхнему левому углу при изменении размера диаграммы. Также, когда ось Y перемещается, метки прилипают к ней.

Спасибо @TaW за предоставление необходимого кода (см. ответ 1)

            ChartArea ca = prodChart.ChartAreas[0];

            Axis ax = ca.AxisX;
            Axis ay = ca.AxisY;
            int px = (int)ax.ValueToPixelPosition(ax.Minimum + (ax.Maximum * 0.01));
            int py = (int)ay.ValueToPixelPosition(ay.Maximum - (ay.Maximum * 0.02));
            px = px - 5;
            qtyLabel.Location = new Point(px, py);
            sheetNameLabel.Location = new Point(px, py + 17);
            dateRangeLabel.Location = new Point(px, py + 34);
person Vasmares    schedule 20.10.2016
comment
Тот же эффект вы получаете из 2-й части ответа, но не полагаясь на установленный максимум. - person TaW; 20.10.2016