2. There is no container.Arrange(layout) method in WinRT version. You could use the layout.Arrange(DiagramItemCollection) method intead to arrange containers' children. E.g. this should create something similar to the JavaScript example:
void LayoutTest()
{
// create child nodes for containers
for (var i = 0; i < 5; i++)
diagram.Factory.CreateShapeNode(0, 0, 30, 30);
for (var i = 1; i < 5; i++)
diagram.Factory.CreateDiagramLink(diagram.Nodes[i / 2], diagram.Nodes[i]);
for (var i = 5; i < 10; i++)
diagram.Factory.CreateShapeNode(0, 0, 30, 30);
for (var i = 1; i < 5; i++)
diagram.Factory.CreateDiagramLink(diagram.Nodes[5 + i / 2], diagram.Nodes[5 + i]);
// create containers
for (var c = 0; c < 2; c++)
{
var container = diagram.Factory.CreateContainerNode(0, 0, 30, 30);
for (var i = c * 5; i < c * 5 + 5; i++)
container.Children.Add(diagram.Nodes[i]);
container.Text = "container " + (c + 1);
container.Brush = Brushes.White;
container.HandlesStyle = HandlesStyle.HatchHandles3;
container.ZBottom(false);
}
ArrangeContainers();
}
void ArrangeContainers()
{
var innerLayout = new TreeLayout();
innerLayout.NodeDistance /= 2;
var outerLayout = new LayeredLayout();
outerLayout.StraightenLongLinks = true;
outerLayout.EnforceLinkFlow = true;
outerLayout.NodeDistance /= 2;
Arrange(diagram, outerLayout, innerLayout);
}
private DiagramItemCollection GetContainerItems(ContainerNode container)
{
DiagramItemCollection items = new DiagramItemCollection();
foreach (DiagramNode node in container.Children)
{
items.Add(node);
foreach (DiagramLink link in node.GetAllLinks())
{
DiagramNode node2 = GetOtherEnd(link, node);
if (node2.Container == container && !items.Contains(link))
items.Add(link);
}
}
return items;
}
private DiagramNode GetOtherEnd(DiagramLink link, DiagramNode node)
{
if (node == link.Origin)
return link.Destination;
if (node == link.Destination)
return link.Origin;
return null;
}
private void Arrange(Diagram diagram, Layout outerLayout, Layout innerLayout)
{
foreach (DiagramNode node in diagram.Nodes)
{
ContainerNode container = node as ContainerNode;
if (container == null)
continue;
innerLayout.Arrange(diagram, GetContainerItems(container));
container.UpdateBounds(5);
}
outerLayout.Arrange(diagram);
/*foreach (DiagramLink link in diagram.Links)
{
if (link.Origin.Container != link.Destination.Container)
link.Route();
}*/
diagram.ResizeToFitItems(5);
}
static class ContainerExtensions
{
public static void UpdateBounds(this ContainerNode container, double margin)
{
if (container.Children.Count == 0)
return;
var r = container.Children[0].Bounds;
foreach (DiagramNode node in container.Children)
r.Union(node.Bounds);
r.X -= margin;
r.Y -= container.CaptionHeight + margin;
r.Width += margin * 2;
r.Height += container.CaptionHeight + margin * 2;
container.SetBounds(r, false);
}
}