データを持つオブジェクトがあり、各オブジェクトは他のオブジェクトに接続されています。(object1->object2、object2->object3、object1->object3 のように)。たとえば、オブジェクトと接続は 2 つのクラスで表されます。
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 (Directed Graph Markup Language)ファイルを生成しました。このファイルには、Visual Studio DGML Viewer が
フォームを介してユーザーにコンテンツを表示する必要があるグラフを作成するための情報が含まれています。プロジェクトに Windows フォームを使用しています。しかし、VS DGML Viewer のようなコントロールはありません。
したがって、System.Graphics で作成された正しい外観のグラフを取得するためにデータを並べ替えることができないため、有向グラフを自動的に作成する方法について別のアイデアが必要です。どうすれば目標を達成できますか?
解決
目標を達成するために、 GraphX for .NET ライブラリを使用しました。このライブラリを使用すると、自動化された視覚化を使用して、データに基づいてさまざまなグラフを作成できます。ただし、Windows フォームの場合、Windows フォームElementHost
内で WPF コントロールをホストするためにコントロールを使用する必要がありました。
グラフを作成するために、次のコードを使用しました。
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;
}