8

現在、最終的に呼び出し関係を視覚化できる Visual Studio プラグイン (VSPackage) を開発しています。それらを表現するために、グラフを管理するGraph#ライブラリを使用したい(エッジの重なりを避けるなど)。残念ながら、XAML で実行時に次のエラー メッセージが表示されます。

XamlParseException: メソッドまたは操作が実装されていません。

<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>

また、独自の頂点、エッジ、およびグラフ レイアウト クラスも作成しました。私のグラフは、最終的にメソッド (頂点) 間の呼び出し関係 (エッジ) を表す必要があります。

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)
    {}
}

ExplorationToolViewModelで、次のように RelationGraph を宣言しました。

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));
}

また、次のエラーが表示されることもありますが、プロジェクトはコンパイルおよび実行されます。

GenericArguments[1]、'Biocoder.InteractiveExploration.Graph.RelationEdge'、'GraphSharp.Algorithms.Layout.ILayoutAlgorithm`3[TVertex,TEdge,TGraph]' は、タイプ 'TEdge' の制約に違反しています。

たぶんそれが問題の原因かもしれませんが、コンパイルして以来、これまでのところ無視し、このチュートリアルに対応して実行しました。

奇妙なことに、Graph# が提供する DLL を使用して、通常の WPF アプリケーションで実際に動作します。Graph-property を省略してもエラーは表示されないので、Graph プロパティに関係していると思います。これを解決する方法についてのヒントはありますか?

事前にどうもありがとうございました!

4

2 に答える 2

2

VSPackage で Graph# を使用すると、同じ問題が発生しました。グラフに Bindings を使用せずGraph、CodeBehind でプロパティを割り当てることで、この問題を解決できました。

これにより、プロパティを割り当てるときに WPFExtensions アセンブリを読み込めないという例外が発生しましたGraph。その理由は、GraphSharp.Controls ではアセンブリが XAML で使用されているためだと思われますが、コードに参照がないため、コンパイル時に参照が追加されません。Graphプロパティを割り当てる前に次の行を追加することで、これを修正できました。

var a = System.Reflection.Assembly.Load("WPFExtensions, Version=1.0.3437.34043, Culture=neutral, PublicKeyToken=null");

この行は、WPF が XAML の参照に基づいてライブラリを読み込もうとする前に、WPFExtensions ライブラリを読み込みます。その後、グラフが表示されました。

于 2014-02-14T16:59:29.133 に答える