C#LightningChart,示波器内实现提示框annotation和游标线cursor跟随鼠标位置实时移动,提示框展示多个信道的Y值

1、初始化提示框和游标线

	public LightningChart _chart;//声明一个LightningChart示波器对象
	Color color = Colors.Black;//定义一个颜色变量
	double mouse_XAxes_value, mouse_YAxes_value; //定义鼠标位置的变量
	
	_chart = new LightningChart();//创建一个LightningChart示波器对象
	_chart.MouseMove += chart MouseMove;//给示波器界面添加一个鼠标移动监测函数,当监测到鼠标在_chart内移动,则会执行该函数
	
	//Add an annotation to show the cursor values
	AnnotationXY cursorvalueDisplay = new AnnotationXY(_chart.ViewXY,_chart.viewxY.XAxes[0],_chart.ViewXY.YAxes[0])
	{
		Style = AnnotationStyle.RoundedRectangle,//设置提示边框风格为圆角边框
		LocationCoordinateSystem = CoordinateSystem.RelativeCoordinatesToTarget
	};
	cursorValueDisplay.Sizing = AnnotationXYSizing.Automatic;//提示框自适应大小
	//cursorValueDisplay.Textstyle.Font = new WpfFont("Lucida Console", 13f,false,false); //设置提示框内的字体风格
	cursorValueDisplay.Textstyle.Color = Colors.White; //设置提示框内的文字颜色为白色
	cursorValueDisplay.Text = " ";//设置提示框内的文本初始为空
	cursorValueDisplay.AllowTargetMove = false;//设置提示框不允许移动
	cursorValueDisplay.Fill.Color = Colors.Transparent; //设置提示框内的颜色填充为透明
	color = colors.Transparent;//定义一个透明的颜色变量
	cursorValueDisplay.Fill.GradientColor = System.Windows.Media.Color.FromArgb(0,color.R, color.G, color.B); //设置提示框渐变色填充为透明
	cursorValueDisplay.BorderVisible = true;//显示边框
	cursorValueDisplay.BorderLinestyle.Color = Colors.White;//设置边框颜色 
	cursorvalueDisplay.BorderLineStyle.Width =1;//设置边框线粗细 
	cursorValueDisplay.Visible = false;
	cursorValueDisplay.KeepVisible = true;//图例框保持在图表内 
	cursorValueDisplay.Anchor.x = 0;//设置提示框和鼠标的相对X位置 
	cursorValueDisplay.Anchor.Y = 0;//设置提示框和鼠标的相对Y位置
	_chart.ViewxY.Annotations.Add(cursorValueDisplay);//在表格中加入设置好属性的提示框
	
	//Add cursor添加游标线
	LineSeriesCursor cursor = new LineSeriesCursor(_chart.ViewXY,_chart.ViewXY.xAxes[0]); 
	_chart.ViewXY.LineSeriesCursors.Add(cursor);
	cursor.ValueAtXAxis = 5;//游标线的初始x位置
	cursor.Linestyle.Width = 1.5; //游标线粗细
	cursor.LineStyle.Pattern = LinePattern.Dot;//游标线的虚实模式 
	cursor.LineStyle.Color = Colors,Yellow;//游标线的颜色
	cursor.TrackPoint.Color1 = Colors.Red;//游标交叉标志的颜色
	_chart.viewXY.ZoomToFit();

2、实现游标线移动的相关函数

	//检测到鼠标移动的执行函数
	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轴坐标,去实时同步更新游标和提示框的位置
			}
		}
	}
				
	private bool SolveValueAccurate(SampleDataBlockSeries series, double xvalue, out double 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; 
				return true;
		}
		else
		{
				return false;
		}
	}
	
	private void UpdateCursorResult (double mouseX,double mousey)
	{
		//Disable rendering, strongly recommended before updating chart properties
		//_chart.BeginUpdate():
		
		//Get cursor
		LineSeriesCursor cursor =_chart.viewXY.LineSeriesCursors[0];
		
		//Get annotation
		AnnotationXY 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 = new StringBuilder() ; 
		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():	
	}
	
	private void_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); 
	}
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值