2016-10-19 10 views
1

Мне нужно левое значение (или местоположение на экране) определенной точки в контроле диаграммы. Basiclly 0,0 Point, потому что он изменяется при изменении размера Формы.Get Form.Left значение Point (X, Y) в ChartControl

веселит

+0

если вы хотите его изменить при изменении размера формы вы можете изменить якорь диаграммы – Keddy1201

ответ

0

Предполагая, что вы имеете в виду положение DataPoint с XValue = 0 и YValue[0] = 0 вы можете использовать функцию XAxisValueToPixelPosition для этого; Вот пример, который предполагает, что вы добавили 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 также работает.

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

enter image description here

РХ, PY значения пикселей являются относительно диаграммы. Чтобы преобразовать их в точку относительно формы, вы можете использовать обычные функции преобразования PointToScreen и PointToClient.


Update:

Если вы действительно хотите, пиксельные координаты верхней левой части ChartArea.InnerPlotPosition вы можете использовать these two functions:

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; 

enter image description here

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

+0

Привет, что basiclly что я ищу, но я не хочу прикреплять ярлык к Datapoint. Я хочу, чтобы метка была прикреплена к верхнему левому углу диаграммы. И остаться там. Изображение: [ссылка] (https://www.dropbox.com/s/3pk41k5l5pag3d5/chart.png?dl = 0) cheers – Mote

+0

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

+0

Pefect ответить: D Thats точно, что я искал. – Mote

0

РЕШЕНИЕ

это был код мне нужен. Он сохраняет метки близко к верхнему левому углу при изменении размера диаграммы. Также, когда ось 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); 
+0

Тот же эффект - это то, что вы получаете от второй части ответа, но не полагаясь на максимальный набор. – TaW