在Graphsharp中向边添加自定义样式

时间:2012-10-17 13:47:06

标签: c# wpf xaml graph-sharp

我正在使用GraphSharp框架,它只有很少的文档(http://graphsharp.codeplex.com/),我正在尝试更改某些边缘的颜色。

实际上是这样的(使这条边变红)。

g.AddEdge(new Edge<object>("A","B"), Color.Red);

有没有人为此提供任何代码段?

1 个答案:

答案 0 :(得分:6)

这是解决方案。您应该创建自定义边缘类型,并将颜色信息存储在边缘对象本身中,或者能够创建可以从边缘对象计算颜色的转换器。

此外,您应该使用EdgeControl来自定义Style

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using GraphSharp;
using QuickGraph;
using GraphSharp.Controls;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public IBidirectionalGraph<object, IEdge<object>> Graph { get; set; }

        public MainWindow()
        {
            var g = new BidirectionalGraph<object, IEdge<object>>();

            IList<Object> vertices = new List<Object>();
            for (int i = 0; i < 6; i++)
            {
                vertices.Add(i.ToString() );
            }

            for (int i = 0; i < 5; i++)
            {
                Color edgeColor = (i % 2 == 0) ? Colors.Black : Colors.Red;
                Console.WriteLine(edgeColor);

                g.AddVerticesAndEdge(new MyEdge(vertices[i], vertices[i+1]) { 
                    Id = i.ToString(),
                    EdgeColor = edgeColor
                });
            }

            Graph = g;

            Console.WriteLine(Graph.VertexCount);
            Console.WriteLine(Graph.EdgeCount);

            InitializeComponent();
        }
    }

    public class MyEdge : TypedEdge<Object>
    {
        public String Id { get; set; }

        public Color EdgeColor { get; set; }

        public MyEdge(Object source, Object target) : base(source, target, EdgeTypes.General) { }
    }

    public class EdgeColorConverter : IValueConverter
    {

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return new SolidColorBrush((Color) value);
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

XAML:

<Window x:Class="WpfApplication1.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:my="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525"
        Name="root">
    <Grid>
        <Grid.Resources>
            <my:EdgeColorConverter x:Key="edgeToEdgeColorConverter"/>
            <Style TargetType="{x:Type graphsharp:EdgeControl}">
                <Style.Setters>
                    <Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource Self},Path=Edge.EdgeColor,Converter={StaticResource edgeToEdgeColorConverter}}"/>
                </Style.Setters>
            </Style>
        </Grid.Resources>

        <graphsharp:GraphLayout x:Name="graphLayout" 
                                Graph="{Binding ElementName=root,Path=Graph}" 
                                OverlapRemovalAlgorithmType="FSA"
                                HighlightAlgorithmType="Simple"
                                LayoutAlgorithmType="FR"/>
    </Grid>
</Window>