Мне нужно левое значение (или местоположение на экране) определенной точки в элементе управления диаграммой. В основном точка 0,0, потому что она меняется при изменении размера формы.
ваше здоровье
Мне нужно левое значение (или местоположение на экране) определенной точки в элементе управления диаграммой. В основном точка 0,0, потому что она меняется при изменении размера формы.
ваше здоровье
Предполагая, что вы имеете в виду положение 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;
Вы можете легко сместить его на несколько пикселей, если хотите.
РЕШЕНИЕ
это был код, который мне был нужен. Он удерживает метки близко к верхнему левому углу при изменении размера диаграммы. Также, когда ось 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);