如何获取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
相关产品推荐
相关产品推荐

