至於chart.ChartAreas[0].CursorX
:甲Chart Cursor
是通過創建並用於zooming和其隨後
表示一個水平或垂直線,其限定沿 軸線的位置的對象。
因此,它與鼠標光標沒有多大關係,在沒有縮放或(禁用縮放功能時)無法選擇時無效。
有幾個選項,你有;不幸的是,沒有一個是簡單的和正是你所要求的。
一簡單的事情就是用HitTest
爲Charts
:
private void chart1_MouseMove(object sender, MouseEventArgs e)
{
HitTestResult hit = chart1.HitTest(e.X, e.Y);
if (hit.PointIndex >= 0)
infoLabel.Text = "Over DataPoint No " + hit.PointIndex;
}
這是簡單和安全的,但只有當光標實際上是在一個DataPoint
會工作。它適合你的程度可能取決於ChartType
;對於Columns
或Bars
非常好,但對於Points
或Bubbles
不太好。
而你可以調用PixelPositionToValue
:
private void chart1_MouseMove(object sender, MouseEventArgs e)
{
var xv = chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X);
var yv = chart1.ChartAreas[0].AxisY.PixelPositionToValue(e.Y);
infoLabel.Text = "x = " + xv + " y =" + yv;
}
在theory這是唯一安全的從Paint
事件的一個呼叫,但在實踐中,似乎從用戶交互稱爲以及何時做工精細。 (如果遇到問題,您可以在Paint
事件之一上執行dummy call並在提取所需值後用標誌中止該示例;該示例做的比您需要的要多得多,但我懷疑它會是什麼必須在所有..)
但是它只會根據軸,而不是最近的DataPoint
帶回Values
。如果你真的需要在實際DataPoint
,你將不得不做了你的Series
..的Points
搜索:
Series S = chart1.Series[0]; // short reference
DataPoint pPrev = S.Points.Select(x => x)
.Where(x => x.XValue >= xv)
.DefaultIfEmpty(S.Points.First()).First();
DataPoint pNext = S.Points.Select(x => x)
.Where(x => x.XValue <= xv)
.DefaultIfEmpty(S.Points.Last()).Last();
這應該彈出一個和下一個DataPoint
。它是由你來決定使用哪一個..
來源
2015-11-24 22:58:18
TaW
位置是什麼樣的對象?這可能不是一個數字,如果你得到「NaN」 –