2012-08-03 23 views
5

Tengo un ZedGraphControl con algunas curvas y quiero agregar líneas verticales en algunas posiciones x fijas. Por supuesto, las líneas solo deberían estar dentro del área del gráfico real.ZedGraph líneas verticales con LineObj issue

me trataron siguiente

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); 

y esto funciona bien hasta que el usuario acerque el gráfico, las líneas verticales luego se extienden fuera del área del gráfico real (ver enlace foto de abajo, también se dio cuenta de que no es discontinua dentro del gráfico, impar).

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

¿Hay una manera de solucionar esto (aunque sólo había aa manera de conseguir myPane.Xaxis.Scale.Min y Max del zoom actual y luego actualizar el gráfico en el ZoomEvent?) O están ¿Hay mejores clases/métodos para usar que no sean LineObj para este propósito?

Respuesta

2

En lugar de definir un LineObj, definir un LineItem y añadirlo a la 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); 

Esto se une line al sistema de coordenadas en el panel gráfico, de modo que cuando uno se acerca o desplazar la posición de line se aún estar confinado en el gráfico. Por supuesto, si aleja la imagen sin actualizar los valores y de line, los extremos line estarán dentro del gráfico.

Sé por experiencia personal que correr puede ser un problema en Zedgraph; sin embargo, parece que el estilo se muestra correctamente al agregar un LineItem.

+0

funciona bien siempre y cuando usted no llamar zedGraphControl.AxisChange (epílogos), en cuyo caso se añadirán margen en la parte inferior, pero supongo que puede hacer todo lo que se requiere esa llamada antes de añadir las líneas. ¡Gracias! – HischT

+2

Una solución es crear un eje Y secundario, luego poner su escala.max y min en ambos 0 y 1, luego adjuntarle el LineItem con dos puntos (x, 0) y (x, 1). De esta manera, permanece independiente del otro eje. – Larry

2

Ha estado en el buen camino con LineObj en lugar de CurveItem.

Eche un vistazo a la estructura Location y la propiedad CoordinateFrame. Permite utilizar un sistema de coordenadas diferente para X y/o Y.

Ajuste de la CoordinateFrame a XScaleYChartFraction permite utilizar 0d 1d y como Y, que significa "la parte inferior" y "la parte superior" del panel gráfico (en vez de YAxis.Scale.Min y YAxis.Scale.Max), ya que X continúa utilizando el sistema de coordenadas de la escala X Axis.

Eso significa que puede usar .AxisChange(), zoom, pan, y LineObj no interferirá con los cambios de escala del eje 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); 
+0

Esto parece una forma mucho mejor de hacerlo que agregar un LineItem, porque las líneas verticales son conceptualmente diferentes a las curvas de datos. – ricovox

+0

Mi búsqueda finalmente ha terminado. – KDecker

Cuestiones relacionadas