//检测到鼠标移动的执行函数private void_chart_MouseMove (object sender,MouseEventArgs e){double X_value,Y_value;Point mousePosition;//定义一个鼠标位置结构体
mousePosition = Mouse.GetPosition(_chart);//获取鼠标在图表控件上的屏幕坐标
_chart.viewXY.XAxes[0].CoordTovalue((int)mousePosition.X,out X_value,true);//将鼠标的屏幕X坐标值换算成示波器控件上的X轴坐标
_chart.viewXY.YAxes[0].CoordTovalue((float)mousePosition.Y,out Y_value,true);//将鼠标的屏幕Y坐标值换算成示波器控件上的Y轴坐标if((X_value < _chart.ViewXY.XAxes [0].Maximum)&&(X_value > _chart.viewXY.XAxes[0].Minimum))//限制转化的值不能超过当前示波器控件的X轴的最大值和最小值区间范围{if((Y_value<_chart.ViewXY.YAxes [0].Maximum)&&(Y_value>_chart.ViewXY.YAxes[0].Minimum))//限制转化的值不能超过当前示波器控件的Y轴的最大值和最小值区间范围 {
mouse_XAxes_value = X_value;
mouse_YAxes_value = Y_value;UpdateCursorResult(mouse_XAxes_value,mouse_YAxes_value);//根据换算后的XY轴坐标,去实时同步更新游标和提示框的位置}}}privateboolSolveValueAccurate(SampleDataBlockSeries series,double xvalue,outdouble yvalue){AxisY axisY =_chart.ViewXY.YAxes[series.AssignYAxisIndex];
yValue =0;LineSeriesValueSolveResult result = series.SolveYValueAtXValue(xValue);if(result.Solvestatus == LineSeriesSolveStatus.OK){//PointLineSeries may have two or more points at same x value. If so, center it between min and max
yValue =(result.YMax + result,YMin)/2.0;returntrue;}else{returnfalse;}}privatevoid UpdateCursorResult (double mouseX,double mousey){//Disable rendering, strongly recommended before updating chart properties//_chart.BeginUpdate()://Get cursorLineSeriesCursor cursor =_chart.viewXY.LineSeriesCursors[0];//Get annotationAnnotationXY cursorValueDisplay =_chart.ViewXY.Annotations[0];//Set annotation target. The location is relative to target.//Use graph bottom as target Y value.float targetYCoord =(float)_chart.ViewXY.GetMarginsRect().Bottom;double y;
_chart.viewXY.YAxes[0].CoordToValue(targetYCoord,out y);
cursorValueDisplay.TargetAxisValues.x = mousex;//设置鼠标坐标位置为提示框X位置
cursorValueDisplay.TargetAxisValues.Y = mouseY;//设置鼠标坐标位置为提示框Y位置double seriesYValue=0;StringBuilder sb =newStringBuilder();int seriesNumber =1;
sb.AppendLine("X: "+ cursor.ValueAtXAxis.Tostring("0.00"));
cursor.ValueAtXAxis = mouseX;//游标线的x位置
cursorValueDisplay.LocationRelativeOffset.X =2;//提示框位置x坐标
cursorValueDisplay.LocationRelativeOffset.Y =0;//提示框位置y坐标foreach(SampleDataBlockSeries series in _chart.ViewXY.SampleDataBlockSeries){//show series titles and cursor values in them, on the right side of the chart,//if cursor values are not shown next to the cursor in an annotation bool resolvedOk =false;
resolvedOK =SolveValueAccurate(series,cursor.ValueAtXAxis,out seriesYValue);AxisY axisY = _chart.ViewXY.YAxes[series.AssignYAxisIndex];
sb.AppendLine(series.Title.Text +": "+ seriesYValue.Tostring("0.000"));//添加每个数据通道的名字和y值
seriesNumber++;}//sb.AppendLine("LX: " + cursorvalueDisplay.LocationRelativeOffset.X.ToString("0.00")); //sb.AppendLine("LY:" + cursorvalueDisplay.LocationRelativeOffset.Y.Tostring("0.00"));//set text
cursorValueDisplay.Text = sb.ToString();//show the label only if it selected to be shown
cursorValueDisplay.visible =true;//Allow chart rendering //_chart,EndUpdate(): }privatevoid_chart_AfterRendering(object sender,AfterRenderingEventArgs e){//Update cursor after the chart has been rendered first time.
_chart.AfterRendering -=chart AfterRendering;UpdateCursorResult(mouse XAxes_value, mouse_YAxes_value);}