2011-11-20 11 views
23

Zauważyłem, że Visual Studio może generować wykresy przy użyciu czegoś zwanego DGML.Biblioteka z generowaniem grafów w języku C#

Chciałbym wygenerować wykres podobny do poniższego w mojej aplikacji C#.

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

To nie musi być interaktywny jak VS. Chcę tylko wygenerować statyczny obraz i zapisać go jako ogólny plik graficzny, taki jak PNG.

Czy jest dostępna bezpłatna biblioteka .NET?

Odpowiedz

3

użyłem NodeXL w przeszłości, do generowania wykresów przepływu pracy w aplikacji internetowej, ale nadaje się do aplikacje komputerowe i interakcja.

Opis może nieco Cię pomylić, co sprawia, że ​​myślisz, że jest to tylko dla Excela. Wcale nie, możesz użyć jego modelu obiektowego bezpośrednio i wykreślić cokolwiek chcesz z .NET.

+0

+1 NodeXL jest bardzo wytrzymałe. Wspaniale nadaje się do graficznego przedstawienia powiązanych danych. Dzięki za referencję! –

+0

Opis jest mylący. Czy to oznacza, że ​​będzie działać na systemie, który nie ma zainstalowanego programu Excel? –

+0

Tak, to prawda, nie miałem również zainstalowanego programu Excel. To było kilka lat temu. W dzisiejszych czasach prawdopodobnie użyłbym D3 do tego lub komponentu używającego d3, takiego jak Dagre, zalecanego tutaj: http://stackoverflow.com/a/20342129/1373170 –

29

Trochę późno, ale to jest rzeczywiście stosunkowo łatwe do wykonania samodzielnie: kontrola 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

Szukałem prostego sposobu na wygenerowanie podstawowego diagramu stanu maszyny z mojego workflow plik. Jest to zdecydowanie najprostszy sposób na osiągnięcie tego. – Filip

+2

Ta odpowiedź kołysze! – gerodim

+1

Uzgodniono, że jest to wspaniała odpowiedź! Mogę otworzyć wynikowy plik dgml w Visual Studio, ale czy ktoś wie jak wyświetlić dgml na formularzu Windows? Dzięki! –