2010-03-11 15 views
3

Qu'est-ce qui ne va pas?Comment faire pour appliquer personnalisé BidirectionalGraph de QuickGraph à GraphLayout à partir du graphique #?

using QuickGraph; 
    using GraphSharp; 

    public class State 
     { 
      public string Name { get; set; } 
      public override string ToString() 
      { 
       return Name; 
      } 
     } 

    public class Event 
     { 
      public string Name; 
      public override string ToString() 
      { 
       return Name; 
      } 
     } 

    BidirectionalGraph<State, TaggedEdge<State, Event>> x = 
        new BidirectionalGraph<State, TaggedEdge<State, Event>>(); 

    GraphLayout graphLayout = new GraphLayout(); 
    graphLayout.Graph = x; 

Erreur:

Impossible de convertir implicitement le type QuickGraph.BidirectionalGraph<ChashaGraphSharp.State,QuickGraph.TaggedEdge<ChashaGraphSharp.State,ChashaGraphSharp.Event>>-QuickGraph.IBidirectionalGraph<object,QuickGraph.IEdge<object>>. Une conversion explicite existe (vous manque un casting?)

Si je mets le casting, alors l'application reçoit une erreur de défaut au démarrage sans aucune information

Qu'est-ce qui ne va pas?

+1

vous dire la propriété Graphique de GraphLayout veut un 'IBidirectionalGraph >' droite? –

Répondre

0

Oui

Mais TaggedEdge n'implémente pas l'interface iEDGE Comment utiliser TaggedEdge personnalisée?

+0

Il est hérité de Edge qui implémente IEdge. Vous pouvez créer une nouvelle classe qui implémentera IEdge et ITagged. –

2

Vous devez créer votre instance de BidirectionGraph en utilisant le type iEDGE au lieu de TaggedEdge:

BidirectionalGraph<State, IEdge<State, Event>> x = 
       new BidirectionalGraph<State, IEdge<State, Event>>(); 

Je ne peux pas dire que je cependant ci-dessus doivent bien comprendre pourquoi cela est le cas, le travail.

EDIT: I asked a question Cela explique en quelque sorte pourquoi cette conversion ne fonctionne pas.

1

Si vous utilisez un graphique personnalisée (pas un « BidirectionalGraph<Object, IEdge<Object> «) Vous devez utiliser un GraphLayout personnalisé qui hérite de » ContextualGraphLayout »

Ici, au lieu d'utiliser « GraphLayout » utiliser « ContextualGraphLayout<State,Edge<<State>>,BidirectionalGraph<State, Edge<State>>> ».

Je conseille fortement de créer des classes de modèles factices pour gagner en lisibilité. Par exemple:

public MyVertex : State { } 
public MyEdge : Edge<MyVertex> { 
    public MyEdge (MyVertex source, MyVertex target) 
     : base(source, target) { } 

}

public MyGraph : BidirectionalGraph<MyVertex, MyEdge> { } 
public MyGraphLayout : ContextualGraphLayout<MyVertex, MyEdge, MyGraph> { 
    public MyGraphLayout() : base() { } 

    public MyGraphLayout (bool allowParallelEdges) 
     : base(allowParallelEdges) { } 

    public MyGraphLayout (bool allowParallelEdges, int vertexCapacity) 
     : base(allowParallelEdges, vertexCapacity) { } 

}