C# Chart可拖动选择数据范围(StripLine实现)

本文介绍如何在图表中实现可拖动的StripLine功能,通过MouseDown、MouseUp和MouseMove事件,允许用户选择并调整StripLine的位置,以实现数据范围的选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经过不懈的努力,和参考各种别人写的资料,终于捣鼓出来初版的  可拖动StripLine来选择范围。

首先画竖线是通过Chart你的StripLine实现:

StripLine sl1 = new StripLine();//新建一个插入线

sl1.BackColor = System.Drawing.Color.Red
sl1.IntervalOffset = 2;//通过IntervalOffset来设置线的位置        
sl1.StripWidth = 1;//设置线的宽度
sl1.Tag = 1;//设置线的标记,用于区分选中的哪个
//sl1.TextAlignment = StringAlignment.Near;
chart1.ChartAreas[0].AxisX.StripLines.Add(sl1);//插入垂直于X轴的StripLine,若垂直于Y轴则用AxisY。

然后就是chart的鼠标事件,我主要用了MouseDown、MouseUp、MouseMove三个事件来实现选中StripLine,拖动以及更新。

下面放一些主要事件代码:

MouseDown事件选中StripLine,其中判定选中的哪一条StripLine是通过Tag来判断的(这个搞了好久···)

private void chart1_MouseDown(object sender, MouseEventArgs e)
        {
          
            if (e.Button == MouseButtons.Right) return;//右键忽略        
            HitTestResult hit = chart1.HitTest(e.X, e.Y);
            if (hit.ChartElementType == ChartElementType.StripLines)
            {
                this.Cursor = Cursors.SizeWE;//鼠标变成左右有箭头的形式
                StripLine sltemp = new StripLine();
                //hit.Object = sltemp;
                sltemp = hit.Object as StripLine;
                //var sltemp = ConvertObject<StripLine>(hit.Object);
                int a = (int)sltemp.Tag; //获得选中的StripLine的Tag
                if (a == 1)
                {
                    striplineselcet = 0;                  
                    this.chart1.MouseMove += new
                    MouseEventHandler(chart1_MouseMove);
                }
                else if (a == 2)
                {
                    striplineselcet = 1;
                    this.chart1.MouseMove += new
                    MouseEventHandler(chart1_MouseMove);
                }
            }           

        }

MouseMove是获得当前鼠标位置对应的横坐标位置:

private void chart1_MouseMove(object sender, MouseEventArgs e)
        {            
            var area = chart1.ChartAreas[0];            
            HitTestResult hit = chart1.HitTest(e.X, e.Y);
            //需先判断鼠标在绘图区,否则PixelPositionToValue会超出范围
            if (hit.ChartElementType == ChartElementType.PlottingArea)
            {
                xv = chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X);//xv是定义好的全局变量
                var yv = chart1.ChartAreas[0].AxisY.PixelPositionToValue(e.Y);                
                richTextBox1.Text = "x = " + xv.ToString("N3") + "\n" + "   y =" +         yv.ToString("N3");
                labelX.Text = "X:" + xv.ToString("N3");
                labelY.Text = "Y:" + yv.ToString("N3");
                
            }            
            labeleX.Text = "e.X:" + e.X.ToString("N3");
            labeleY.Text = "e.Y:" + e.Y.ToString("N3");          
        }

最后就是MouseUp事件,用来将选择的StripLine释放掉,同时更新线的位置:

private void chart1_MouseUp(object sender, MouseEventArgs e)
        {
            if (striplineselcet == 0)
                sl1.IntervalOffset = xv;
            else if (striplineselcet == 1)
                sl2.IntervalOffset = xv;
            //sl1.IntervalOffset = lcl;
            //sl2.IntervalOffset = ucl;
            tBLCL.Text = sl1.IntervalOffset.ToString("N5");
            tBUCL.Text = sl2.IntervalOffset.ToString("N5");
            chart1.Invalidate();
            striplineselcet = 2;
            this.Cursor = Cursors.Default;//鼠标变回默认形态
        }

以上就基本完成了,只是不能实时的更新的拖动中的线。

附上界面图:

以上主要参考如下大神的资源:

https://www.it1352.com/509041.html

https://blog.youkuaiyun.com/qq_30725967/article/details/86502990

https://www.cnblogs.com/puffy/p/11440775.html

菜鸟第一次发稿,大家将就看哈~~~

### 使用 Chart 控件中的 StripLine 功能 `StripLine` 是 `Chart` 控件的一个重要特性,用于在图表上显示特定范围内的视觉提示线或区域。它可以帮助突出某些数据区间或者提供额外的信息层。 以下是关于如何配置和使用 `StripLine` 的详细介绍: #### 配置 StripLine 属性 要向图表的轴添加 `StripLine`,可以通过设置其属性来定义位置、颜色以及宽度等参数。这些属性主要包括但不限于以下几项[^1]: - **Interval**: 定义条纹之间的间隔。 - **IntervalOffset**: 设置第一个条纹相对于起点的位置偏移量。 - **BackColor/Color**: 背景颜色或线条的颜色。 - **StripeWidth**: 条纹的宽度(仅适用于水平方向上的带状效果)。 - **BorderDashStyle 和 BorderColor**: 边框样式及其颜色。 下面是一个简单的 C# 示例代码展示如何创建并应用一条垂直的 `StripLine` 到 Y 轴上: ```csharp // 获取指定名称的第一个图表区对象 var chartArea = Chart1.ChartAreas["ChartAreas_DayHisLine"]; if (chartArea != null) { // 创建一个新的YAxis StripLine实例 var stripLine = new System.Windows.Forms.DataVisualization.Charting.StripLine(); // 设定StripLine的相关属性 stripLine.Interval = 0; // 不重复绘制其他strip lines. stripLine.IntervalOffset = 50; // 偏移到y=50处开始生效. stripLine.BackColor = Color.LightGray; // 设置背景填充色为浅灰色. stripLine.BorderDashStyle = ChartDashStyle.Solid; stripLine.BorderColor = Color.Black; // 将此新建立好的StripLine加入到目标坐标系之下的Y-Axis集合当中去 chartArea.AxisY.StripLines.Add(stripLine); } ``` 上述脚本片段展示了怎样通过编程方式往既有的图表区域内增加自定义标记线的功能实现方法。 #### 注意事项 当调整多个 `StripLine` 实例时需要注意它们之间可能存在的重叠现象;另外也要考虑性能影响,在大量复杂图形渲染场景下谨慎启用过多装饰性的附加组件。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值