У меня есть диаграмма, которая связана с 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();
}
GetNodes()
и GetAssociations()
возвращают соответствующий ObservableCollections
. Когда объекты в этих коллекциях жестко запрограммированы перед запуском программы, позиционирование диаграммы работает отлично. Когда объекты добавляются в списки, когда программа уже запущена, все узлы располагаются друг над другом.