2011-11-20 31 views
23

Me di cuenta de que Visual Studio puede generar gráficos utilizando algo llamado DGML.Biblioteca de generación de gráficos dirigida C#

Me gustaría generar un gráfico como el siguiente en mi aplicación C#.

http://bishoponvsto.files.wordpress.com/2010/02/dgml-graph1.jpg

No tiene que ser interactivo como el VS. Solo quiero generar una imagen estática y guardarla como un archivo de gráficos generales, como PNG.

¿Hay alguna biblioteca libre de .NET para esto?

Respuesta

3

he utilizado NodeXL en el pasado, para generar gráficos de flujo de trabajo dentro de una aplicación web, pero es adecuado para aplicaciones de escritorio e interacción también.

La descripción puede confundirlo un poco, haciéndole creer que es solo para Excel. No del todo, puedes usar su modelo de objetos directamente y graficar lo que quieras de .NET.

+0

+1 de NodeXL es muy robusto. Es genial para representar datos relacionados gráficamente. Gracias por la referencia! –

+0

La descripción es de hecho confusa. ¿Eso significa que funcionaría en un sistema que no tiene instalado Excel? –

+0

Sí, eso es correcto, tampoco tenía Excel instalado. Ahora, esto fue hace unos años. Hoy en día probablemente usaría D3 para este o un componente usando d3, como Dagre, que se recomienda aquí: http://stackoverflow.com/a/20342129/1373170 –

29

Un poco tarde, pero en realidad es relativamente fácil de implementar mismo: control de WPF

public class DGMLWriter 
{ 
    public struct Graph 
    { 
     public Node[] Nodes; 
     public Link[] Links; 
    } 

    public struct Node 
    { 
     [XmlAttribute] 
     public string Id; 
     [XmlAttribute] 
     public string Label; 

     public Node(string id, string label) 
     { 
      this.Id = id; 
      this.Label = label; 
     } 
    } 

    public struct Link 
    { 
     [XmlAttribute] 
     public string Source; 
     [XmlAttribute] 
     public string Target; 
     [XmlAttribute] 
     public string Label; 

     public Link(string source, string target, string label) 
     { 
      this.Source = source; 
      this.Target = target; 
      this.Label = label; 
     } 
    } 

    public List<Node> Nodes { get; protected set; } 
    public List<Link> Links { get; protected set; } 

    public DGMLWriter() 
    { 
     Nodes = new List<Node>(); 
     Links = new List<Link>(); 
    } 

    public void AddNode(Node n) 
    { 
     this.Nodes.Add(n); 
    } 

    public void AddLink(Link l) 
    { 
     this.Links.Add(l); 
    } 

    public void Serialize(string xmlpath) 
    { 
     Graph g = new Graph(); 
     g.Nodes = this.Nodes.ToArray(); 
     g.Links = this.Links.ToArray(); 

     XmlRootAttribute root = new XmlRootAttribute("DirectedGraph"); 
     root.Namespace = "http://schemas.microsoft.com/vs/2009/dgml"; 
     XmlSerializer serializer = new XmlSerializer(typeof(Graph), root); 
     XmlWriterSettings settings = new XmlWriterSettings(); 
     settings.Indent = true; 
     XmlWriter xmlWriter = XmlWriter.Create(xmlpath, settings); 
     serializer.Serialize(xmlWriter, g); 
    } 
} 
+1

Estaba buscando una manera simple de generar un diagrama de máquina de estado básico de mi flujo de trabajo archivo. Esta es, de lejos, la forma más simple de lograr eso. – Filip

+2

¡Esta respuesta es genial! – gerodim

+1

Estoy de acuerdo en que esta es una gran respuesta! Puedo abrir el dgml resultante en Visual Studio, pero ¿alguien sabe cómo mostrar el dgml en un formulario de Windows? ¡Gracias! –

Cuestiones relacionadas