如何在WPF中轻松绘制图表?

36
我需要绘制表示有限状态机的图形。我尝试使用Graph#,它很酷,但缺少一些功能。没有文档,这使得使用非常困难,我不能使用其自定义WPF控件绘制循环(从一个顶点到自身的边),标记边也未实现。是否有其他库或建议的方法在WPF中绘制图形?
我需要的功能:
- 边缘标签 - 循环(周期性)边缘 - 顶点标签 - 绘制单个/双重圆圈围绕顶点 - 顶点应表示为带有标签的圆圈(或双重圆圈)
任何想法?

编辑:

我收到了一些建议,非常感谢。然而,我认为我没有清晰地表达我的想法。我需要这种类型的图表:

http://static.max99x.com/school/automata-editor1.png.

所有目前提供的工具都不适用于此,或者我不知道如何在这种情况下使用它们。

尝试使用Dynamic Data Display - 它绝对具有循环功能 http://dynamicdatadisplay.codeplex.com/ - Rachel Gallen
这里还有一些其他选项:https://dev59.com/nEbRa4cB1Zd3GeqP1Y2Q - Rachel Gallen
@RachelGallen,你能告诉我如何使用Dynamic Data Display绘制边连接顶点的图形吗?文档很差,从教程中也看不出如何做这种事情。Silverlight版本对我无效,WPF版本我也不知道如何使用。 - pmichna
6个回答

79

选项1:Microsoft自动图形布局

免费

http://research.microsoft.com/en-us/projects/msagl/

GitHub

https://github.com/Microsoft/automatic-graph-layout.git

Winforms >> WPF

这是WinForms,但只需几行代码即可导入到WPF中。

使用Microsoft Automatic Graph Layout可视化节点和边

http://www.codeguru.com/csharp/.net/net_wpf/article.php/c16963/Visualizing-Nodes-and-Edges-with-Microsoft-Automatic-Graph-Layout.htm

示例

http://research.microsoft.com/en-us/projects/msagl/#Layouts

FAQ

http://research.microsoft.com/en-us/projects/msagl/faq.aspx

选项2:QuickGraph - 一款支持Graphviz的100% C#图形库

免费

http://quickgraph.codeplex.com/

这个库是完全使用C#编写的。不要被“Graphviz支持”这一行所误导,这意味着它使用C#代码来导入Graphviz的输出。没有任何C++代码。

http://www.codeproject.com/Articles/5603/QuickGraph-A-C-graph-library-with-Graphviz-Sup

有一个NuGet软件包。

从2003年到2011年正在开发中(长达8年!!)。

选项3:GraphSharp

免费。

http://graphsharp.codeplex.com/

  • 依赖于QuickGraph(100% C#编写)。
  • 支持async/await(很棒!)。

演示

https://sachabarbs.wordpress.com/2010/08/31/pretty-cool-graphs-in-wpf/

注意事项

这个很好用,几个小时就可以搞定。它还支持DataTemplates,所以每个节点都可以有任何你想要的外观。

选项4:Graphviz4net

免费

http://graphviz4net.codeplex.com/

选项5:GoDiagram

$$$

http://www.nwoods.com/products/godiagram/index.html

选项6:WPF的图形树绘制控件

免费

http://www.codeproject.com/Articles/29518/A-Graph-Tree-Drawing-Control-for-WPF

不适用。这是一种树形布局。

选项7:使用WPF可视化循环依赖图

免费

http://www.codeproject.com/Articles/43776/Using-WPF-to-Visualize-a-Graph-with-Circular-Depen

选项8:GraphViz

免费

http://www.graphviz.org/Download..php

这不是C#,使用的是非托管代码。但有C#包装器可用。
由AT&T开源,参见“AT&T研究员-发明服务背后的科学”和“研究主页>组合>软件工具”: http://www.research.att.com/software_tools?fbid=NEk8_gxLLEc

http://www.graphviz.org/Download_source.php

他们还开源了Rserve!
选项9:Shields.GraphViz
免费
GraphViz的包装器。

https://github.com/timothy-shields/graphviz

选项10:NetworkView:用于可视化和编辑网络、图表和流程图的WPF自定义控件

免费

http://www.codeproject.com/Articles/182683/NetworkView-A-WPF-custom-control-for-visualizing-a

这个库允许用户创建节点之间的连接,可能有点过度设计。

示例

https://channel9.msdn.com/coding4fun/blog/Noodling-Network-Nodes-Diagraming-with-the-NetworkView-custom-WPF-control

这全是MVVM。

选项11:Gephi - 开放的图形可视化平台

免费

查看 http://gephi.github.io/

虽然不是WPF绘图库,但提供了非常好的图形示例。教程非常优秀。

选项12:Telerik

$$$

http://www.telerik.com/products/wpf/diagrams.aspx

选项13:Infragistics

$$$

http://www.infragistics.com/samples/wpf/network-node/overview http://www.infragistics.com/samples/wpf/network-node/relationship-between-nodes http://www.infragistics.com/samples/wpf/network-node/custom-node-style

选项14:WPF图表设计师

免费

这不是一个纯粹的绘图工具,但它可以展示如何在画布上移动、调整大小和旋转任何类型的对象。

http://www.codeproject.com/Articles/22952/WPF-Diagram-Designer-Part-1

选项15: MVVM图表设计师

免费

而且,有人在MVVM中重新实现了这个功能:虽然不是很高级的绘图工具,但它可以展示如何在画布上移动、调整大小和旋转任意类型的对象。

http://www.codeproject.com/Articles/484616/MVVM-Diagram-Designer

选项16:yWorks - 绘图公司

$$$

https://www.yworks.com/en/products_yfiles_practicalinfo_gallery.html https://www.yworks.com/en/products_yfileswpf_about.html

选项17:MindFusion

$$$

http://www.mindfusion.eu/features-wpfdiagram.html http://www.mindfusion.eu/

选项18:Dot2WPF

免费

一种用于查看DOT图形的WPF控件。

http://www.codeproject.com/Articles/18870/Dot-WPF-a-WPF-control-for-viewing-Dot-graphs

选项19:SyncFusion

$$$

https://www.syncfusion.com/products/wpf/diagram

选项20:AddFlow

$$$

https://www.componentsource.com/product/addflow-wpf-standard

选项21:拉萨尔

$$$

http://www.lassalle.com/

选项22:动态数据显示

http://dynamicdatadisplay.codeplex.com/

选项 23: Nevron

$$$

https://www.nevron.com/

仅适用于WinForms,但可以导入到WPF中。然而,每个单独的项目都无法进行模板化,这是WPF解决方案的一个巨大优势。

谷歌搜索词

  • "workflow wpf graphing"
  • "wpf graphing library"
  • "wpf state machine library"


5
我认为你可以使用WPF的GraphX库轻松实现所有需求。它基于Graph#并有详细的文档。 http://panthernet.ru/en/projects-en/graphx-en 它支持边缘标记和自环边,同时支持边缘和顶点模板。如果您有任何问题,可以在该网站的讨论部分提问。

我想选择你的项目,感谢你制作了免费版本。谢谢。 - Aberro
或者不支持。看起来你的解决方案不支持每个顶点多个(不同的)连接节点,这对我来说非常重要,令人遗憾。 - Aberro
不确定您的意思,但是GraphX支持许多连接节点,包括静态节点。 您只需配置它(请参阅示例应用程序)。 - Alexander Smirnov
我的意思是像这个例子中的连接: https://www.codeproject.com/Articles/182683/NetworkView-A-WPF-custom-control-for-visualizing-a 此外,我需要强大的MVVM支持,但是据我所知,在你们的项目中,我看到这种模式至少在某种程度上被违反了。总的来说,我认为上面链接中的NetworkView更适合我的需求。 - Aberro

4

4
如果这是商业场景,您还应该看一下yWorks的yFiles。它具有您正在寻找的所有功能,其最突出的特点是自动排列图表的能力。如果您有一个更大的状态机甚至在代码中创建状态机,这将帮助您自动清晰地排列甚至大型图表。此外,对于标签,还有自动标签放置算法,可以为标签找到位置,使其不会与其他元素重叠或与其他无关元素重叠。
您可以在这个Youtube视频中实时查看库的效果,但您也可以立即使用Silverlight在线演示进行操作,或者仅评估库并使用示例源进行操作。
免责声明:我在yWorks工作,但在SO上我不代表雇主。

2

以下是一些选项:

希望你能找到需要的东西。那些收费的也有免费试用版。使用telerik或visifire可以得到非常好的结果!


Telerik真的很不错。 - GodsCrimeScene
是的。非常花哨的控件。遗憾的是,试用版有时会向您的页面/应用程序添加额外的文本(信息)。 - Chris
1
@Chris Telerik可能很好,但我不知道如何在我的项目中使用它。这些中的哪一个 - http://www.telerik.com/help/wpf/radchart-features-chart-types-2d-charts.html - 可以绘制顶点并用边连接它们?我需要像这样的东西:http://static.max99x.com/school/automata-editor1.png。 - pmichna
2
-1 这个问题是关于图形而不是图表的,它不应该成为最佳答案。 - Zarat
抱歉,我没有看到这篇文章的编辑。在我回答时它还不存在。我明白你的观点。 - Chris
显示剩余3条评论

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