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;
    }
}
Другие вопросы по тегам