C# 基础设施:如何动态添加数据并使用ForceDirectedGraphDiagramLayout?
我有一个关系图,它绑定到节点的C# 基础设施:如何动态添加数据并使用ForceDirectedGraphDiagramLayout?,c#,wpf,infragistics,C#,Wpf,Infragistics,我有一个关系图,它绑定到节点的ObservableCollection和连接的ObservableCollection。当节点和连接硬编码到这些列表中时,图表会很好地显示它们。但是,当稍后在程序中将节点和连接值添加到列表中时,所有节点都会在窗口的中心位置彼此重叠。在这个场景中,ForceDirectedGraphDiagramLayout似乎没有按我想象的方式工作。我的问题是,如何将数据动态添加到图表中,并使图表处于ForceDirectedGraphDiagramLayout 这是我的表格:
ObservableCollection
和连接的ObservableCollection
。当节点和连接硬编码到这些列表中时,图表会很好地显示它们。但是,当稍后在程序中将节点和连接值添加到列表中时,所有节点都会在窗口的中心位置彼此重叠。在这个场景中,ForceDirectedGraphDiagramLayout
似乎没有按我想象的方式工作。我的问题是,如何将数据动态添加到图表中,并使图表处于ForceDirectedGraphDiagramLayout
这是我的表格:
<Grid Background="White">
<ig:XamDiagram x:Name="Diagram"
OptionsPaneVisibility="Visible"
NavigationPaneVisibility="Visible"
DefaultDragInteraction="Pan">
<ig:XamDiagram.NodeDefinitions>
<ig:NodeDefinition TargetType="{x:Type models:EntityType}"
KeyMemberPath="Name"
ConnectionPointsMemberPath="EntityPoints" >
<ig:NodeDefinition.NodeStyle>
<Style TargetType="ig:DiagramNode" >
<Setter Property="DisplayTemplate" Value="{StaticResource NodeTemplate}"/>
<Setter Property="ShapeType" Value="None" />
<Setter Property="Fill" Value="{Binding RelativeSource={RelativeSource Self}, Path=Content.FillColor, Converter={StaticResource con}, Mode=TwoWay}" />
<Setter Property="Width" Value="140" />
</Style>
</ig:NodeDefinition.NodeStyle>
</ig:NodeDefinition>
</ig:XamDiagram.NodeDefinitions>
<ig:XamDiagram.ConnectionDefinitions>
<ig:ConnectionSourceDefinition TargetType="{x:Type models:Association}"
StartNodeKeyMemberPath="End1Name"
EndNodeKeyMemberPath="End2Name"
StartNodeConnectionPointNameMemberPath="PointFromName"
EndNodeConnectionPointNameMemberPath="PointToName">
<ig:ConnectionSourceDefinition.ConnectionStyle>
<Style TargetType="ig:DiagramConnection">
<Setter Property="StartCapType" Value="None"/>
<Setter Property="EndCapType" Value="FilledArrow"/>
<Setter Property="DisplayTemplate" >
<Setter.Value>
<DataTemplate/>
</Setter.Value>
</Setter>
</Style>
</ig:ConnectionSourceDefinition.ConnectionStyle>
</ig:ConnectionSourceDefinition>
</ig:XamDiagram.ConnectionDefinitions>
<ig:XamDiagram.Layout>
<ig:ForceDirectedGraphDiagramLayout Buffer="200" />
</ig:XamDiagram.Layout>
</ig:XamDiagram>
</Grid>
代码隐藏:
private CurrentData currentData = CurrentData.GetInstance();
private ObservableCollection<EntityType> Nodes { get; set; }
private ObservableCollection<Association> Associations { get; set; }
public MyDiagram()
{
InitializeComponent();
Nodes = currentData.GetNodes();
Associations = currentData.GetAssociations();
Diagram.ItemsSource = Nodes;
Diagram.ConnectionsSource = Associations;
}
void OnLoad(object sender, RoutedEventArgs e)
{
Diagram.ScaleToFit();
}
private CurrentData CurrentData=CurrentData.GetInstance();
私有ObservableCollection节点{get;set;}
私有ObservableCollection关联{get;set;}
公共关系图()
{
初始化组件();
Nodes=currentData.GetNodes();
Associations=currentData.GetAssociations();
Diagram.ItemsSource=节点;
Diagram.connectionsource=关联;
}
void OnLoad(对象发送器,RoutedEventArgs e)
{
ScaleToFit()图;
}
GetNodes()
和GetAssociations()
返回各自的可观察集合
。当这些集合中的对象在程序运行之前硬编码时,图表定位就可以完美地工作。当程序已在运行时将对象添加到列表中时,所有节点都放置在彼此的顶部 我通过将数据绑定从代码隐藏构造函数移动到OnLoad()
函数,解决了这个问题
下面的代码如下所示:
private CurrentData currentData = CurrentData.GetInstance();
private ObservableCollection<EntityType> Nodes { get; set; }
private ObservableCollection<Association> Associations { get; set; }
public MyDiagram()
{
InitializeComponent();
}
void OnLoad(object sender, RoutedEventArgs e)
{
Nodes = currentData.GetNodes();
Associations = currentData.GetAssociations();
Diagram.ItemsSource = Nodes;
Diagram.ConnectionsSource = Associations;
Diagram.ScaleToFit();
}
private CurrentData CurrentData=CurrentData.GetInstance();
私有ObservableCollection节点{get;set;}
私有ObservableCollection关联{get;set;}
公共关系图()
{
初始化组件();
}
void OnLoad(对象发送器,RoutedEventArgs e)
{
Nodes=currentData.GetNodes();
Associations=currentData.GetAssociations();
Diagram.ItemsSource=节点;
Diagram.connectionsource=关联;
ScaleToFit()图;
}