使用GraphSharp图形布局WPF库绘制图形并编辑顶点标签

时间:2012-10-22 14:14:34

标签: c# wpf graph graph-sharp

我是一名大学生,这是我的算法分析教授传授给我们班级的一项功课。我不使用家庭作业标签,因为它被弃用,但它基本上是功课。非常感谢任何帮助。

我们要使用任何读取<graphml...>标准中的xml的语言创建程序,并将其绘制到程序屏幕,使用{{告诉图表有多少个节点,边和连接的组件。 3}}计数。

我已经使用graphsharp的c#图形布局库制作了这个程序,加上它在xml读取上绘制图形,但只计算按钮点击上的项目以给它一些交互。

我已经完成了这个绘图+计数部分。问题是这个graphsharp项目几乎没有文档,我需要显示BFS通过我的图表的顺序。我做了一些非常简单的事情,比如在BFS执行过程中更改节点的标签名称,如下所示:

  • “n0”变为“n0-1”
  • “n1”变为“n1-2”
  • 等......

我得到的问题是:

Property or indexer 'QuickGraph.IVertexSet<object>.Vertices'
cannot be assigned to -- it is read only

顶点只是“可创建”,不可编辑吗?

2 个答案:

答案 0 :(得分:1)

创建一个具有属性Name的自定义顶点类。而不是创建新顶点(因为graph.vertices [i] =“newstr”意味着您将第i个对象更改为全新的对象/字符串),更改现有顶点的内容(定义{{​​1}}属性)。

如果使用自定义顶点类型,则应定义自定义DataTemplate,以便能够按预期渲染顶点。

答案 1 :(得分:0)

我想我已经知道为什么这个组件在Edge-part中被设为只读。这可能与渲染这些图形的方式有关。我在下面创建了另一个示例代码,删除了Edge并将其添加回图形(这将在某种程度上实现您的目标,但可能也不希望您想要(在图中似乎没有其他方法可以更改Edge) ))。

在我看来,在你真正绘制图形之前,你希望你的树被放置(我认为这也是组件的意图)。如果你能完成它,请告诉我。

    string edgeSource = "n3";
    string edgeTarget = "n4";
    string newEdgeSource = "n0";
    string newEdgeTarget = "n4";

    IEnumerator<IEdge<object>> edgeEnumeratoer = g.Edges.GetEnumerator();
    edgeEnumeratoer.MoveNext();
    while (edgeEnumeratoer.Current != null)
    {
        var edge = edgeEnumeratoer.Current;
        string source = (string)(edge.Source);
        string target = (string)(edge.Target);
        if ((source.CompareTo(edgeSource) == 0) && (target.CompareTo(edgeTarget) == 0))
        {
            if (g.RemoveEdge(edge))
            {
                IEdge<object> newEdge = new Edge<object>(newEdgeSource, newEdgeTarget);
                g.AddEdge(newEdge);
                break;
            }
            else
            {
                Debug.WriteLine("Could not remove edge from graph.");
            }
        }
        edgeEnumeratoer.MoveNext();
    }

    graphLayout.Graph = g;