我有一个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之外的其他东西?
答案 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);