ZedGraph垂直线与LineObj问题

时间:2012-08-03 11:48:12

标签: c# .net graph zedgraph

我有一个ZedGraphControl,里面有几条曲线,我想在一些固定的x位置添加垂直线。这些线当然应该只在实际的图形区域内。

我试过了

LineObj line = new LineObj(Color.Black, xPos, myPane.YAxis.Scale.Min, xPos, myPane.YAxis.Scale.Max);  
line.Line.Style = System.Drawing.Drawing2D.DashStyle.Dash;
line.Line.Width = 1f;
myPane.GraphObjList.Add(line);

这样可以正常工作,直到用户缩放图形,然后垂直线将伸出实际图形区域(参见下面的图片链接,同时注意它没有在图形内部划线,奇数)。

http://imageshack.us/photo/my-images/196/zedgraphzoom.png/

有没有办法解决这个问题(如果只有一种方法可以获得当前缩放的myPane.Xaxis.Scale.Min和Max,然后更新ZoomEvent中的图形?)或者是否有更好的类/方法为此目的使用除LineObj之外的其他东西?

2 个答案:

答案 0 :(得分:3)

不是定义LineObj,而是定义LineItem并将其添加到GraphPane.CurveList

LineItem line = new LineItem(String.Empty, new[] { xPos, xPos },
                new[] { myPane.YAxis.Scale.Min, myPane.YAxis.Scale.Max }, 
                Color.Black, SymbolType.None);
line.Line.Style = System.Drawing.Drawing2D.DashStyle.Dash;
line.Line.Width = 1f;

myPane.CurveList.Add(line);

这会将line绑定到图表窗格中的坐标系,这样当您缩放或平移时,line位置仍将限制在图表中。当然,如果您在不更新y line值的情况下缩小,则line两端将位于图表内。

根据个人经验,我知道在Zedgraph中潇洒可能是一个问题;但是,在添加LineItem时,似乎正好显示了破折号。

答案 1 :(得分:3)

使用LineObj而不是CurveItem,你的方法很好。

查看Location结构和CoordinateFrame属性。它允许对X和/或Y使用不同的坐标系。

CoordinateFrame设置为XScaleYChartFraction允许使用0d和1d作为Y,这意味着图形窗格的“底部”和“顶部”(而不是YAxis.Scale.Min和YAxis .Scale.Max),因为X继续使用X轴刻度坐标系。

这意味着你可以使用.AxisChange(),zoom,pan和LineObj不会干扰Y轴的比例变化!

var line = new LineObj(Color.Black, xPos, 0, xPos, 1);

line.Location.CoordinateFrame = XScaleYChartFraction; // This do the trick !
line.IsClippedToChartRect = true;

line.Line.Style = System.Drawing.Drawing2D.DashStyle.Dash;
line.Line.Width = 1f;

myPane.GraphObjList.Add(line);