protected override Size ArrangeOverride(Size finalSize) { base.ArrangeOverride(finalSize); content.Width = finalSize.Width; content.Height = finalSize.Height; Rect newRegion = new Rect(0, 0, finalSize.Width, finalSize.Height); if (newRegion != region && newRegion.Width > 0 && newRegion.Height > 0) { TreemapRenderer t = this, child; while (true) { child = t.activeChild; if (child == null) { t.SetRegion(newRegion); break; } t = child; } } return(finalSize); }
// Render a child void Clicked(Node n) { TreemapRenderer c = new TreemapRenderer(n, n.Name); Size ns = new Size(region.Width, region.Height); c.Measure(ns); c.Arrange(region); var xlate = new TranslateTransform() { X = n.Rect.X, Y = n.Rect.Y }; var scale = new ScaleTransform() { ScaleX = n.Rect.Width / region.Width, ScaleY = n.Rect.Height / region.Height }; c.RenderTransform = new TransformGroup { Children = { scale, xlate } }; c.Opacity = 0.5; content.Children.Add(c); activeChild = c; // Animations TimeSpan time = TimeSpan.FromSeconds(0.3); var s = new Storyboard() { Children = { Animate(time, xlate, "X", 0), Animate(time, xlate, "Y", 0), Animate(time, scale, "ScaleX", 1.0), Animate(time, scale, "ScaleY", 1.0), Animate(time, c, "Opacity", 1.0), } }; s.Begin(); }
public void Back() { TreemapRenderer last = this, child = activeChild; while (child != null && child.activeChild != null) { last = child; child = child.activeChild; } if (child != null) { Rect childRegion = child.region; last.content.Children.Remove(child); last.activeChild = null; // In case layout changed while we were rendering the child if (childRegion != region) { SetRegion(childRegion); } } }