Ho provato la tua risposta, ma non ha funzionato per me. Ha finito per mettere il cursore in un punto e mai in movimento. Credo che questo sia dovuto al fatto che utilizzo valori decimali/doppi lungo entrambi gli assi e che il cursore sia arrotondato al numero intero più vicino.
Dopo diversi tentativi, sono stato in grado di elaborare un metodo per determinare dove si trova il cursore all'interno del grafico. La parte difficile è stata capire che tutte le "posizioni" per gli elementi del grafico sono in realtà valori percentuali (da 0 a 100).
Secondo
http://msdn.microsoft.com/en-us/library/system.windows.forms.datavisualization.charting.elementposition.aspx:
"Definisce la posizione dell'elemento grafico in coordinate relative, che vanno da (0,0) a (100,100)."
Spero non ti dispiaccia, sto postando questa risposta qui solo per i posteri, nel caso in cui qualcun altro si imbatta in questo problema, e anche il tuo metodo non funziona per loro. Non è bello o elegante in alcun modo, ma finora funziona per me.
private struct PointD
{
public double X;
public double Y;
public PointD(double X, double Y)
{
this.X = X;
this.Y = Y;
}
}
private void chart1_MouseMove(object sender, MouseEventArgs e)
{
var pos = LocationInChart(e.X, e.Y);
lblCoords.Text = string.Format("({0}, {1}) ... ({2}, {3})", e.X, e.Y, pos.X, pos.Y);
}
private PointD LocationInChart(double xMouse, double yMouse)
{
var ca = chart1.ChartAreas[0];
//Position inside the control, from 0 to 100
var relPosInControl = new PointD
(
((double)xMouse/(double)execDetailsChart.Width) * 100,
((double)yMouse/(double)execDetailsChart.Height) * 100
);
//Verify we are inside the Chart Area
if (relPosInControl.X < ca.Position.X || relPosInControl.X > ca.Position.Right
|| relPosInControl.Y < ca.Position.Y || relPosInControl.Y > ca.Position.Bottom) return new PointD(double.NaN, double.NaN);
//Position inside the Chart Area, from 0 to 100
var relPosInChartArea = new PointD
(
((relPosInControl.X - ca.Position.X)/ca.Position.Width) * 100,
((relPosInControl.Y - ca.Position.Y)/ca.Position.Height) * 100
);
//Verify we are inside the Plot Area
if (relPosInChartArea.X < ca.InnerPlotPosition.X || relPosInChartArea.X > ca.InnerPlotPosition.Right
|| relPosInChartArea.Y < ca.InnerPlotPosition.Y || relPosInChartArea.Y > ca.InnerPlotPosition.Bottom) return new PointD(double.NaN, double.NaN);
//Position inside the Plot Area, 0 to 1
var relPosInPlotArea = new PointD
(
((relPosInChartArea.X - ca.InnerPlotPosition.X)/ca.InnerPlotPosition.Width),
((relPosInChartArea.Y - ca.InnerPlotPosition.Y)/ca.InnerPlotPosition.Height)
);
var X = relPosInPlotArea.X * (ca.AxisX.Maximum - ca.AxisX.Minimum) + ca.AxisX.Minimum;
var Y = (1 - relPosInPlotArea.Y) * (ca.AxisY.Maximum - ca.AxisY.Minimum) + ca.AxisY.Minimum;
return new PointD(X, Y);
}
Ho appena provato questo: pX funziona bene, ma pY rimane costante (= 1) (mentre entrambi e.X ed e.Y cambiano). Inoltre aggiunge un mirino a schema completo che può essere indesiderato in alcuni casi particolari. – Ivan