我有一个带有数据的对象,每个对象都连接到其他对象。(如 object1->object2、object2->object3、object1->object3)。例如由两个类表示的对象和连接:
class Object
{
public int Id{get;set;}
public string Name{get;set;}
public Object(int id, string name)
{
Id = id;
Name = name;
}
}
class Relation
{
public Object obj1{get;set;}
public Object obj2{get;set;}
public Relation(Object o1, Object o2)
{
obj1 = o1;
obj2 = o2;
}
}
例如,以这种方式存储的数据:
List<Relation> relations = new List<Relation>();
List<Object> objects = new List<Object>();
我在我的解决方案中生成了一个DGML(有向图标记语言)文件,其中包含 Visual Studio DGML 查看器的信息,以构建
我需要通过表单向用户显示其内容的图形。我正在为我的项目使用 Windows 窗体。但是没有VS DGML Viewer这样的控件。
所以我需要另一个想法如何自动构建有向图,因为我无法对数据进行排序以获得使用 System.Graphics 制作的正确外观的图。我怎样才能实现目标?
解决方案
我使用GraphX for .NET 库来实现我的目标。该库允许基于具有自动化可视化的数据构建不同的图表。但是对于需要使用ElementHost
控件在 Windows 窗体内托管 WPF 控件的 Windows 窗体。
对于构建图,我使用了以下代码:
private GraphExample GenerateGraph()
{
var dataGraph = new GraphExample();
foreach (Object obj in objects)
{
var dataVertex = new DataVertex(obj.name);
dataGraph.AddVertex(dataVertex);
}
var vlist = dataGraph.Vertices.ToList();
foreach (Relation rel in relations)
{
var v1 = vlist.First(x => x.Text == rel.obj1.name);
var v2 = vlist.First(x => x.Text == rel.obj2.name);
var dataEdge = new DataEdge(v1, v2) { Text = $"From {v1.Text} to {v2.Text}" };
dataGraph.AddEdge(dataEdge);
}
return dataGraph;
}