C1Chart for WPF自定义可移动的线
在上一篇文章,我们介绍了如何创建一条可移动的线:C1chart创建可移动的线。
之前是创建Marker,并通过Action为鼠标拖拽。本文就来介绍如何自定义这条线。
假设我们需要给这条拖拽的线定义一个拖拽的范围,就不能使用原来的Action来定义鼠标拖拽,而是需要将原本的Action属性设置为None,然后使用鼠标相关事件来控制自己的逻辑。
步骤如下:
第一步:
调用鼠标的相关事件。
本文使用MouseLeftButtonDown/MouseMove/MouseLeftButtonUp事件。
代码参考:
var pnl = new ChartPanel(); pnl.MouseLeftButtonDown += pnl_MouseLeftButtonDown; pnl.MouseMove += new MouseEventHandler(pnl_MouseMove); pnl.MouseLeftButtonUp += pnl_MouseLeftButtonUp;
第二步:
创建Marker,并且设置Action为None。
代码参考:
var vmarker = CreateMarker(false, new Point()); pnl.Children.Add(vmarker); vmarker.Action = ChartPanelAction.None; chart.View.Layers.Add(pnl);
第三步:
处理鼠标相关事件的逻辑。
声明一个isDown属性,在MouseLeftButtonUp的时候设置为false,在MouseLeftButton设置为true。
并且在MouseLeftButtonDown事件里,获取鼠标的位置,判断当鼠标位置和可移动的线的差值满足需求的时候,可以进行移动。
代码参考:
void pnl_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { isDown = false; } void pnl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { ChartPanel cnp = sender as ChartPanel; Point mouse = chart.View.PointToData(e.GetPosition(chart)); var oldmarkerX = (cnp.Children[0] as ChartPanelObject).DataPoint.X; oldmarkerX = (Double.IsNaN(oldmarkerX)) ? 0 : oldmarkerX; var value = Math.Abs(mouse.X - oldmarkerX); if (Math.Abs(mouse.X - oldmarkerX) < 2.5) { isDown = true; } }
在MouseMove的事件里,就可以移动线。
代码参考:
void pnl_MouseMove(object sender, MouseEventArgs e) { if (isDown) { ChartPanel cnp = sender as ChartPanel; Point pnt = e.GetPosition(chart); var rect = chart.View.PlotRect; var oldmarkerX = chart.View.PointFromData((cnp.Children[0] as ChartPanelObject).DataPoint).X; oldmarkerX = (Double.IsNaN(oldmarkerX)) ? 0 : oldmarkerX; if (rect.Contains(pnt)) { cnp.Children.Clear(); var vmarker = CreateMarker(false, pnt); cnp.Children.Add(vmarker); } } }
结果:
至此,运行后,会出现一条可移动的线,在该线的差值2.5的范围内允许拖动。
本文所示的示例源代码请下载:AddDragLineToChart.zip (11.24 kb)
更多资源
C1Chart的在线英文产品文档地址:
http://helpcentral.componentone.com/nethelp/c1wpfchart/#!Documents/componentonechartforwpf.htm
如果你对C1Chart感兴趣,请到我们的官网下载最新版本:/developer/componentone-winform/controls/chart
如果你有疑问,可以到GCDN论坛获得技术支持:http://gcdn.grapecity.com.cn/showforum-68.html