GraphSharp Tree Layout LeftToRight
Я пытаюсь создать дерево с GraphSharp из CodePlex.
Я посмотрел на образец приложения и попытался "перепроектировать" пример.
Проблема в том, что, если я пытаюсь установить LayoutAlgorithmType = "Tree" программным путем, я получаю TargetInvocationException..., что таинственно, потому что в примере это работает.
Мой вопрос: как создать график с макетом дерева и ориентацией слева направо.
Заранее спасибо:)
Мой код:
public partial class MainWindow : Window
{
private IBidirectionalGraph<object, IEdge<object>> _graphToVisualize;
public IBidirectionalGraph<object, IEdge<object>> GraphToVisualize
{
get { return _graphToVisualize; }
}
public MainWindow()
{
CreateGraphToVisualize();
InitializeComponent();
}
private void CreateGraphToVisualize()
{
var g = new BidirectionalGraph<object, IEdge<object>>();
string[] vs = new string[5];
for (int i = 0; i < 5; i++)
{
vs[i] = i.ToString();
g.AddVertex(vs[i]);
}
//add some edges
g.AddEdge(new Edge<object>(vs[0], vs[1]));
g.AddEdge(new Edge<object>(vs[0], vs[2]));
g.AddEdge(new Edge<object>(vs[2], vs[3]));
g.AddEdge(new Edge<object>(vs[1], vs[4]));
g.AddEdge(new Edge<object>(vs[3], vs[4]));
layout.LayoutMode = LayoutMode.Automatic;
layout.LayoutAlgorithmType = "Tree";
_graphToVisualize = g;
}
}
XAML:
<Window x:Class="Test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:graphsharp="clr-namespace:GraphSharp.Controls;assembly=GraphSharp.Controls"
xmlns:GraphSharp_Controls="clr-namespace:GraphSharp.Controls;assembly=GraphSharp.Controls"
xmlns:graph="clr-namespace:GraphSharp.Controls;assembly=GraphSharp.Controls"
xmlns:Controls="clr-namespace:WPFExtensions.Controls;assembly=WPFExtensions"
Title="MainWindow" Height="350" Width="525"
x:Name="root">
<Grid>
<Controls:ZoomControl>
<graph:GraphLayout x:Name="layout" />
</Controls:ZoomControl>
</Grid>
</Window>
2 ответа
Посмотрев исходный код графа # lib, я сам нашел решение.
Сначала вы должны добавить алгоритм LayoutAlgorithm к вашему пространству имен:
xmlns:tree="clr-namespace:GraphSharp.Algorithms.Layout.Simple.Tree;assembly=GraphSharp"
После этого вы можете добавить дополнительный LayoutParameter к вашему GraphLayout. В моем случае я просто изменил направление дерева с TopToBottom на LeftToRight.
<graphsharp:GraphLayout x:Name="graphLayout"
Graph="{Binding ElementName=root,Path=GraphToVisualize}"
LayoutAlgorithmType="Tree"
OverlapRemovalAlgorithmType="FSA"
HighlightAlgorithmType="Simple" RenderTransformOrigin="0.5,0.5">
<graphsharp:GraphLayout.LayoutParameters>
<tree:SimpleTreeLayoutParameters Direction="LeftToRight"></tree:SimpleTreeLayoutParameters>
</graphsharp:GraphLayout.LayoutParameters>
</graphsharp:GraphLayout>
Поэтому, если вы хотите изменить параметр графа, вы должны посмотреть (например, в обозревателе решений Visual Studio) алгоритмы.->Layout->Simple->Tree -> SimpleTreeLayoutParameters в моем случае.
В коде:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void root_Loaded(object sender, RoutedEventArgs e)
{
CreateGraphToVisualize();
}
private void CreateGraphToVisualize()
{
var g = new BidirectionalGraph<object, IEdge<object>>();
string[] vs = new string[5];
for (int i = 0; i < 5; i++)
{
vs[i] = i.ToString();
g.AddVertex(vs[i]);
}
//add some edges
g.AddEdge(new Edge<object>(vs[0], vs[1]));
g.AddEdge(new Edge<object>(vs[0], vs[2]));
g.AddEdge(new Edge<object>(vs[2], vs[3]));
g.AddEdge(new Edge<object>(vs[1], vs[4]));
g.AddEdge(new Edge<object>(vs[3], vs[4]));
//Simple Tree layout parameter variable
GraphSharp.Algorithms.Layout.Simple.Tree.SimpleTreeLayoutParameters simpleTreeLayoutParameters = new GraphSharp.Algorithms.Layout.Simple.Tree.SimpleTreeLayoutParameters();
//Simple Tree layout parameter variable values
simpleTreeLayoutParameters.Direction = GraphSharp.Algorithms.Layout.LayoutDirection.LeftToRight; //THIS IS WHAT YOU EXPECT
simpleTreeLayoutParameters.LayerGap = 10.0;
simpleTreeLayoutParameters.OptimizeWidthAndHeight = false;
simpleTreeLayoutParameters.SpanningTreeGeneration = GraphSharp.Algorithms.Layout.Simple.Tree.SpanningTreeGeneration.DFS;
simpleTreeLayoutParameters.VertexGap = 10.0;
simpleTreeLayoutParameters.WidthPerHeight = 2.0;
//Set layout
layout.LayoutAlgorithmType = "Tree";
layout.LayoutParameters = simpleTreeLayoutParameters;
layout.LayoutMode = LayoutMode.Automatic;
layout.Graph = g;
}
}