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