You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Windows Forms Chart中AxisY与AxisY2的显示位置

解决WinForms Chart滚动条下Y轴间绘制水平线的问题

问题描述

当前代码通过AxisX.Minimum和Maximum转换像素位置的方式绘制Y轴间水平线,仅在无滚动条(所有数据可见)时有效。当开启X轴缩放/滚动后,AxisX.Minimum/Maximum代表整个数据集的范围,而非当前视图显示的范围,导致线条超出AxisY左侧或AxisY2右侧。需要获取两个Y轴的实际显示像素位置,确保线条始终在两轴之间。

解决方案

方法1:直接获取绘图区域边界(推荐)

AxisY固定在绘图区域左侧,AxisY2固定在右侧,可通过InnerPlotPosition获取绘图区域的百分比位置,转换为像素坐标:

private void DrawLine(object sender, PaintEventArgs e) 
{
    ChartArea chartArea = chart1.ChartAreas[0];
    // 获取绘图区域的百分比位置与大小
    RectangleF plotAreaPercent = chartArea.InnerPlotPosition.ToRectangleF();
    
    // 转换为控件客户端像素坐标
    float axisYLeft = chart1.Width * plotAreaPercent.X / 100;
    float axisY2Right = chart1.Width * (plotAreaPercent.X + plotAreaPercent.Width) / 100;
    
    // 可选:将Y坐标绑定到具体Y轴数值(比如Y=5的位置)
    float yPosition = (float)chartArea.AxisY.ValueToPixelPosition(5);
    
    // 绘制水平线
    e.Graphics.DrawLine(new Pen(Color.Red, 5), axisYLeft, yPosition, axisY2Right, yPosition);
}

方法2:基于当前视图的X范围

通过ScaleView.ViewMinimum和ViewMaximum获取当前显示的X轴范围,再转换为像素位置:

private void DrawLine(object sender, PaintEventArgs e) 
{
    ChartArea chartArea = chart1.ChartAreas[0];
    // 获取当前视图的X轴最小/最大值(非整个数据集)
    double viewMinX = chartArea.AxisX.ScaleView.ViewMinimum;
    double viewMaxX = chartArea.AxisX.ScaleView.ViewMaximum;
    
    // 转换为像素位置
    int axisYLeft = (int)chartArea.AxisX.ValueToPixelPosition(viewMinX);
    int axisY2Right = (int)chartArea.AxisX.ValueToPixelPosition(viewMaxX);
    
    // 固定Y坐标或绑定到Y轴数值
    int yPosition = 50;
    
    e.Graphics.DrawLine(new Pen(Color.Red, 5), axisYLeft, yPosition, axisY2Right, yPosition);
}

关键说明

  • InnerPlotPosition以控件宽度的百分比表示绘图区域的位置,不受X轴缩放/滚动影响,直接对应当前显示的Y轴边界。
  • ScaleView.ViewMinimum/ViewMaximum仅在开启X轴缩放(ScaleView.Zoom)后有效,代表当前视图显示的X范围。
  • 务必在Paint事件中执行绘制逻辑,确保控件重绘时自动适配滚动/缩放后的状态。

内容的提问来源于stack exchange,提问作者Pan ache

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 23:37:45