Как изменить внешний вид вершин GraphSharp в XAML - PullRequest
0 голосов
/ 30 июня 2019

Я использую GraphSharp в своем проекте, где мне нужно изменить внешний вид вершин. Я попытался создать собственный класс вершин, который имел только одно свойство с именем Name. Затем я создал класс ViewModel, в котором я создал вершины и ребра. Чтобы отобразить этот график, я создал шаблон данных для своей пользовательской вершины. Код выглядит следующим образом: -

class MyVertex
{
    public string Name { get; set; }
}

class MainViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged([CallerMemberName]string name = "")
    {
        if (PropertyChanged == null) return;
        PropertyChanged(this, new PropertyChangedEventArgs(name));
    }

    public IBidirectionalGraph<MyVertex, IEdge<MyVertex>> Graph { get; private set; }

    public void CreateGraphToVisualize()
    {
        var g = new BidirectionalGraph<MyVertex, IEdge<MyVertex>>();

        //add the vertices to the graph
        MyVertex[] vertices = new MyVertex[5];
        for (int i = 0; i < 5; i++)
        {
            vertices[i] = new MyVertex { Name = "Vertex " + i.ToString() };
            g.AddVertex(vertices[i]);
        }

        //add some edges to the graph
        g.AddEdge(new Edge<MyVertex>(vertices[0], vertices[1]));
        g.AddEdge(new Edge<MyVertex>(vertices[1], vertices[2]));
        g.AddEdge(new Edge<MyVertex>(vertices[2], vertices[3]));
        g.AddEdge(new Edge<MyVertex>(vertices[3], vertices[1]));
        g.AddEdge(new Edge<MyVertex>(vertices[1], vertices[4]));

        Graph = g;
    }

    public MainViewModel()
    {
        CreateGraphToVisualize();
    }
}

<Window x:Class="GraphSharpBasic.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:graphsharp="clr-namespace:GraphSharp.Controls;assembly=GraphSharp.Controls"
        xmlns:zoom="clr-namespace:WPFExtensions.Controls;assembly=WPFExtensions"
        xmlns:local="clr-namespace:GraphSharpBasic"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <DataTemplate DataType="{x:Type local:MyVertex}">
            <Border BorderBrush="Beige" BorderThickness="2" Background="Gainsboro" MinWidth="50" MinHeight="10">
                <TextBlock Text="{Binding Name}"/>
            </Border>
        </DataTemplate>
    </Window.Resources>
    <Window.DataContext>
        <local:MainViewModel/>
    </Window.DataContext>
    <Grid>
        <zoom:ZoomControl>
            <graphsharp:GraphLayout x:Name="graphLayout"
                           Graph="{Binding Graph}"
                            LayoutAlgorithmType="ISOM"
                            OverlapRemovalAlgorithmType="FSA"
                            HighlightAlgorithmType="Simple"/>
        </zoom:ZoomControl>
    </Grid>
</Window>

Но когда я запускаю его, я просто получаю управление масштабированием, но без графика. Итак, я думаю, что делаю что-то не так. Затем я нашел this , создал новый проект и скопировал представленный там код. Мне пришлось использовать свое суждение относительно того, где разместить DataTemplate, поэтому я поместил его в блок Window.Resources так же, как приведенный выше код. Я также внес некоторые изменения в код, чтобы использовать универсальные классы, так как те, которые использовались на сайте, были явно недоступны. Но конечный результат был таким же, как мой собственный код. Там не было никакого графика. Я что-то здесь упускаю? Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 08 июля 2019

GraphLayout не может быть создан без правильной комбинации типов.

Добавьте что-то вроде этого:

public class MyGraph : BidirectionalGraph<MyVertex, IEdge<MyVertex>>{}

public class MyGraphLayout : GraphLayout<MyVertex, IEdge<MyVertex>,MyGraph> 
    {
    };

, затем используйте вместо этого определенный MyGraphLayout.

<local:MyGraphLayout x:Name="graphLayout"
                           Graph="{Binding Graph}"
                            LayoutAlgorithmType="ISOM"
                            OverlapRemovalAlgorithmType="FSA"
                            HighlightAlgorithmType="Simple"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...