wpf - español - Error de método u operación no implementado en Enlace
wpf binding types (2)
He experimentado el mismo problema cuando uso Graph # en un VSPackage. Pude superar el problema al no utilizar enlaces para el gráfico, sino al asignar la propiedad Graph
en CodeBehind.
Esto condujo a una excepción de que el ensamblaje WPFExtensions no se pudo cargar al asignar la propiedad Graph
. Sospecho que la razón de esto es que en GraphSharp.Controls, el ensamblado se usa en XAML, pero la referencia no se agrega al compilar, ya que no hay referencias en el código. Pude arreglar esto agregando la siguiente línea antes de asignar la propiedad Graph
:
var a = System.Reflection.Assembly.Load("WPFExtensions, Version=1.0.3437.34043, Culture=neutral, PublicKeyToken=null");
Esta línea carga la biblioteca WPFExtensions antes de que WPF intente cargarla según la referencia en el XAML. Luego, se mostró el gráfico.
Actualmente estoy desarrollando un plugin de Visual Studio (VSPackage) que finalmente debería poder visualizar relaciones de llamadas. Para representarlos, quiero usar la biblioteca Graph # que gestiona el gráfico (evitando bordes superpuestos, etc.). Desafortunadamente recibo el siguiente mensaje de error en tiempo de ejecución en mi XAML:
XamlParseException: el método u operación no está implementado.
El error aparece en la <graph:CallRelationGraphLayout Graph="{Binding RelationGraph}"/>
.
<UserControl x:Class="Biocoder.InteractiveExploration.View.ExplorationControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:graphsharp="clr-namespace:GraphSharp.Controls;assembly=GraphSharp.Controls"
xmlns:zoom="clr-namespace:WPFExtensions.Controls;assembly=WPFExtensions"
xmlns:graph="clr-namespace:Biocoder.InteractiveExploration.Graph"
xmlns:viewmodels="clr-namespace:Biocoder.InteractiveExploration.ViewModel"
xmlns:controls="clr-namespace:Biocoder.InteractiveExploration.Controls" mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.DataContext>
<viewmodels:ExplorationToolViewModel/>
</UserControl.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<zoom:ZoomControl Grid.Row="1"
Zoom="0.2"
ZoomBoxOpacity="0.5"
Background="Yellow">
<graph:CallRelationGraphLayout Graph="{Binding RelationGraph}"/>
</zoom:ZoomControl>
</Grid>
</UserControl>
También creé propias clases de diseño de vértice, borde y gráfico. Mi gráfica finalmente debería representar relaciones de llamada (bordes) entre métodos (vértices).
MethodVertex.cs
public class MethodVertex
{
public string ID { get; private set; }
public bool IsMale { get; private set; }
public MethodVertex(string id, bool isMale)
{
ID = id;
IsMale = isMale;
}
public override string ToString()
{
return string.Format("{0}-{1}", ID, IsMale);
}
}
RelationEdge.cs
public class RelationEdge : Edge<MethodVertex>
{
public string Id { get; private set; }
public RelationEdge(string id, MethodVertex source, MethodVertex target)
: base(source, target)
{
Id = id;
}
}
CallRelationGraphLayout.cs
public class CallRelationGraphLayout : GraphLayout<MethodVertex, RelationEdge, CallRelationGraph>
{}
CallRelationGraph.cs
public class CallRelationGraph : BidirectionalGraph<MethodVertex, RelationEdge>
{
public CallRelationGraph()
{}
public CallRelationGraph(bool allowParallelEdges)
: base(allowParallelEdges)
{ }
public CallRelationGraph(bool allowParallelEdges, int vertexCapacity)
: base(allowParallelEdges, vertexCapacity)
{}
}
En el ExplorationToolViewModel , declare el RelationGraph de la siguiente manera:
private CallRelationGraph _relationGraph;
public CallRelationGraph RelationGraph
{
get { return _relationGraph; }
set
{
if (value != _relationGraph)
{
_relationGraph = value;
NotifyPropertyChanged("RelationGraph");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
Lo que quizás también debería mencionar es que a veces aparece el siguiente error pero el proyecto se compila y se ejecuta.
GenericArguments [1], ''Biocoder.InteractiveExploration.Graph.RelationEdge'', en ''GraphSharp.Algorithms.Layout.ILayoutAlgorithm`3 [TVertex, TEdge, TGraph]'' infringe la restricción de tipo ''TEdge''.
Tal vez es la fuente del problema, pero lo ignoré hasta el momento ya que compilé y lo hice de acuerdo con este tutorial .
Lo extraño es que realmente funciona en una aplicación WPF normal utilizando las DLL proporcionadas por Graph #. Cuando dejo fuera la propiedad Graph, el error no aparece, así que supongo que tiene que ver con la propiedad Graph. ¿Alguna pista sobre cómo resolver esto?
¡Muchas gracias por adelantado!
En mi caso, un ensamblaje no se copió en la carpeta de salida porque copy local se configuró en falso. El ajuste copy local en true lo resolvió. (Un conjunto A dependía del conjunto B que no tenía la bandera local de copia).