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