C#有向图生成库

31

我注意到Visual Studio可以使用DGML生成图表。

我想在我的C#应用程序中生成如下图所示的图表:

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

它不必像VS那样交互式。我只想生成静态的这样的图片,并将其保存为通用的图形文件,例如PNG。

是否有任何免费的.NET库可用于此目的?

4个回答

39

稍晚了一些,但其实自己实现是相对容易的:

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;
        using (XmlWriter xmlWriter = XmlWriter.Create(xmlpath, settings))
        {
            serializer.Serialize(xmlWriter, g);
        }
    }
}

1
我正在寻找一种简单的方法,从我的工作流文件中生成基本状态机图。这绝对是最简单的方法来实现这个目标。 - Filip
1
同意这是一个很好的答案!我可以在Visual Studio中打开生成的dgml文件,但是有没有人知道如何在Windows窗体上显示dgml文件?谢谢! - Justin Kauffman
3
xmlWriter 应该被释放! - t0b4cc0
很棒的答案,我几乎不需要做任何事情就可以让它支持组 https://learn.microsoft.com/en-us/visualstudio/modeling/customize-code-maps-by-editing-the-dgml-files?view=vs-2019#OrganizeNodes - Max Young

3

对于事后来的任何人,现在有一个NuGet包(GitHub),使创建DGML文件更加容易,包括支持样式和附加属性元数据。我最初使用了Simon的答案(对我的最初需求非常有效),然后在寻找改进输出方式的方法时,偶然发现了NuGet包。希望它能有所帮助。

对于任何对工具组合感兴趣的人,我一直在与 DgmlImageNuGet 包; 注意,这将自己暴露为包中工具目录中的可执行文件,因此我手动将其提取到可以轻松调用它的位置),NDepend(商业软件,但非常方便,我相信对于开源项目是免费的)和 LINQPad(免费的,但我认为值得购买许可证)一起使用,在尝试设计主要重构时从临时查询中生成复杂代码库的图表。能够使用简单的 LINQ 查询对代码库提出问题、生成图表并快速连续显示结果是非常棒的体验。请注意,我与这些项目/产品没有任何关联,我只是因为使用这些工具组合的经验非常美妙,所以想向任何试图做类似事情的人推荐它。


1
第一个链接DgmlBuilder看起来很不错!我甚至考虑将其用于可视化一般的分层数据,他们那里的NodeBuilder模式看起来很有吸引力。 - Alex KeySmith
1
不错,看起来很方便。请注意,如果您在Visual Studio中运行代码,则可以使用官方的Microsoft.VisualStudio.GraphMode(请参见https://learn.microsoft.com/en-us/dotnet/api/microsoft.visualstudio.graphmodel)。 - Chris

3
我过去曾经使用 NodeXL 来在 Web 应用程序中生成工作流程图,但它也适用于桌面应用程序和交互。这个描述可能会让你有些困惑,让你认为它只适用于 Excel。但实际上,你可以直接使用它的对象模型,并从 .NET 中绘制任何你想要的图形。

NodeXL的WPF控件非常强大,非常适合以图形方式表示相关数据。感谢您的推荐! - Cameron Tinker
描述确实有些混淆。这是否意味着它可以在没有安装Excel的系统上运行? - Damn Vegetables
是的,没错,我也没有安装Excel。这是几年前的事了。现在,我可能会使用D3或使用D3的组件,比如Dagre,推荐在这里:https://dev59.com/4GMk5IYBdhLWcg3wyw_H#20342129。 - Pablo Romeo

1

CodePlex正在被微软废弃,... 在GitHub上有许多分支(请参见https://github.com/search?p=1&q=graphsharp&type=Repositories)。 - ergohack
@ergohack:非常感谢,我已经将这个加入到我的答案中了。 - Doc Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接