我正在使用GraphSharp框架,它只有很少的文档(http://graphsharp.codeplex.com/),我正在尝试更改某些边缘的颜色。
实际上是这样的(使这条边变红)。
g.AddEdge(new Edge<object>("A","B"), Color.Red);
有没有人为此提供任何代码段?
答案 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>