2012-06-19 28 views
5

Tengo dos curvas en el control de ZedGraph, después de trazar las curvas ambos ...Cómo traer curvas específicas en frente de ZedGraph

PointPairList thresholdList = new PointPairList(); 
PointPairList powerList = new PointPairList(); 

private void plotPower() 
{ 
     // Create an object to access ZedGraph Pane 
     GraphPane pane = zedGraphControl1.GraphPane;    
     LineItem thresholdLine = new LineItem("thresholdLine"); 
     LineItem powerLine = new LineItem("powerLine"); 

     // Set the Threshold Limit 
     double thresoldLimit = Convert.ToDouble(numAnalysisThreshold2.Value); 

     // Points 
     double[] x = new double[]{0, pane.XAxis.Scale.Max}; 
     double[] y = new double[]{thresoldLimit, thresoldLimit}; 

     // Set the threshold line curve list 
     thresholdList.Add(x, y); 

     // Set the Power Line curve list 
     powerdList.Add(XData, YData); 

     // Add Curves 
     thresholdLine = pane.AddCurve("", thresholdList, Color.Red, SymbolType.None); 
     powerLine = pane.AddCurve("", powerList, Color.Red, SymbolType.None); 

     // Refresh Chart 
     this.Invalidate(); 
     zedGraphControl1.Refresh(); 
} 

en el código anterior, me las arreglé para trazar las curvas como dos curva de línea de potencia sobre la curva de línea de umbral.

Ahora mis preguntas son, si quiero traer cualquiera de la curva al frente ... ¿Hay algún método disponible (por ejemplo: bringittoFront() ....) ...?

Gracias mucho por su tiempo .... :)

+1

Muy problema, suponiendo que se puede usar un CurveItem en * varios * GraphPanes ... – Larry

Respuesta

8

El GraphPane contiene una propiedad CurveList, y la clase CurveList es una subclase de List<CurveItem>. Si configura la propiedad CurveItem.Tag para cada curva que dibuje, creo que debería poder ordenar los elementos de curva utilizando el método CurveList.Sort(IComparer<CurveItem>) y usando el Tag para representar el orden de clasificación.

actualización de junio 19 de

ejemplo simple: dos líneas, el azul line2 con line2.Tag = 2 y el rojo line1 con line1.Tag = 1. En la inicialización, line2 se agrega primero al panel de gráfico, por lo que se mostrará en la parte superior.

void GraphInit() 
{ 
    var line2 = _graph.GraphPane.AddCurve("Second", 
     new[] { 0.1, 0.5, 0.9 }, new[] { 0.1, 0.5, 0.1 }, Color.Blue); 
    line2.Tag = 2; 

    var line1 = _graph.GraphPane.AddCurve("First", 
     new[] { 0.1, 0.5, 0.9 }, new[] { 0.1, 0.5, 0.9 }, Color.Red); 
    line1.Tag = 1; 

    _graph.Refresh(); 
} 

Initial display before sorting

Para ordenar, primero implementar una clase que implementa IComparer<CurveItem>, y que ordena los elementos de curva en orden ascendente basado en el valor numérico de la propiedad CurveItemTag:

class CurveItemTagComparer : IComparer<CurveItem> 
{ 
    public int Compare(CurveItem x, CurveItem y) 
    { 
     return ((int)x.Tag).CompareTo((int)y.Tag); 
    } 
} 

Para realizar una nueva clasificación y actualizar el gráfico, implemente el siguiente controlador de eventos para el botón Ordenar :

void SortButtonClick(object sender, EventArgs e) 
{ 
    _graph.GraphPane.CurveList.Sort(new CurveItemTagComparer()); 
    _graph.Refresh(); 
} 

Ahora, cuando se hace clic en el botón Ordenar, las curvas se ordenan de tal manera que la curva con el valor de la etiqueta más bajo, es decir line1, en lugar será dibujado en la parte superior. Además, tenga en cuenta que el orden de la curva en la leyenda cambia a lo largo.

Graph after Sort button is clicked

+3

wow, acabas de alegrarme el día ... Me costó mucho establecer la propiedad de la etiqueta de la curva .... Usted es * y muchas gracias por la explicación clara ... :) – SanVEE

+0

Esto me da un error de compilación en la línea '_graph.GraphPane.CurveList.Sort()' - "No hay sobrecarga para el método 'Ordenar' toma 1 argumentos "- Los parámetros parecen ser 'Ordenar (Tipo de Tipo de Sort, índice int)'. – colmde

3

Y, para que lo necesite, este es el código de la clase IComparer para vb.net:

Public Class CurveItemTagComparer 
    Implements IComparer(Of CurveItem) 
    Function Compare(ByVal x As ZedGraph.CurveItem, ByVal y As ZedGraph.CurveItem) As Integer _ 
    Implements System.Collections.Generic.IComparer(Of CurveItem).Compare 
     Return CInt(x.Tag).CompareTo(CInt(y.Tag)) 
    End Function 
End Class 

Giovanni

5

Hay una manera muy fácil. Use el método Move() en la clase CurveList. Por ejemplo, en:

zedGraphControl1.GraphPane.CurveList.Move(index,relativePos)

establecer relativePos a -1 moverá la posición de objeto en la lista anterior, mientras que 1 lo moverá una posición posterior.Para mover un elemento al principio de la lista, use un valor negativo grande (como -999). Para moverlo al final de la lista, use un gran valor positivo.

Cuestiones relacionadas