2011-11-20 8 views
23

Ho notato che Visual Studio può generare grafici usando qualcosa chiamato DGML.Libreria di generazione del grafico diretto C#

Mi piacerebbe generare un grafico come il seguente nella mia applicazione C#.

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

Non deve essere interattivo come il VS. Voglio solo generare un'immagine statica di questo tipo e salvarla come un file di grafica generale, come PNG.

Esiste una libreria .NET gratuita per questo?

risposta

3

ho usato NodeXL in passato, per la generazione di grafici del flusso di lavoro all'interno di un'applicazione web, ma è adatto per applicazioni desktop e interazione pure.

La descrizione potrebbe confondervi un po ', facendovi pensare che sia solo per Excel. Niente affatto, è possibile utilizzare direttamente il suo modello di oggetti e graficare ciò che si desidera da .NET.

+0

+1 di NodeXL è molto robusto. È ottimo per rappresentare graficamente i dati correlati. Grazie per il riferimento! –

+0

La descrizione è in atto che confonde. Significa che funzionerebbe su un sistema che non ha Excel installato? –

+0

Sì, è corretto, non ho nemmeno Excel installato. Ora, questo è stato un po 'di anni fa. Al giorno d'oggi probabilmente userei D3 per questo o un componente usando d3, come Dagre, consigliato qui: http://stackoverflow.com/a/20342129/1373170 –

29

Un po 'in ritardo, ma in realtà è relativamente facile da implementare da soli: controllo 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

Cercavo un modo semplice per generare il diagramma di base dello stato macchina dal mio flusso di lavoro file. Questo è di gran lunga il modo più semplice per riuscirci. – Filip

+2

Questa risposta oscilla! – gerodim

+1

Concordato che questa è un'ottima risposta! Posso aprire il dgml risultante in Visual Studio, ma qualcuno sa come visualizzare il dgml su un modulo di Windows? Grazie! –