public void AddStateAtRuntime () { Rectangle rect = new Rectangle { Name = RootName }; VSMControl c = new VSMControl (); c.ApplyTemplate (); // Create a visual state in code which we will try to use to animate the template element called 'Grid' foreach (VisualStateGroup g in VisualStateManager.GetVisualStateGroups (c.TemplateGrid)) { VisualState s = new VisualState (); s.SetValue (FrameworkElement.NameProperty, "C"); s.Storyboard = CreateWidthStoryboard (RootName, 600, 700); g.States.Add (s); } // The template element "Grid" can't be found by the new storyboard CreateAsyncTest (c, () => { Assert.IsTrue (VisualStateManager.GoToState (c, "A", false), "#1"); Assert.Throws<InvalidOperationException> (() => VisualStateManager.GoToState (c, "C", false), "#2"); // Adding a new element called 'Grid' to the TestPanel does not work TestPanel.Children.Add (rect); Assert.Throws<InvalidOperationException> (() => VisualStateManager.GoToState (c, "C", false), "#3"); // The new element is not findable from the control Assert.IsNull (c.FindName (RootName), "#4"); Assert.AreSame (rect, TestPanel.FindName (RootName), "#5"); // Adding it to the template grid instead TestPanel.Children.Remove (rect); c.TemplateGrid.Children.Add (rect); // It's not findable from the panel, but it is from the Control Assert.AreSame (rect, c.FindName (RootName), "#6"); Assert.IsNull (TestPanel.FindName (RootName), "#7"); // Once it's findable from the control, the storyboard will resolve to the new element and succeed Assert.IsTrue (VisualStateManager.GoToState (c, "C", false), "#8"); }, () => { Assert.AreEqual (700, rect.Width, "#9"); // The template element 'Grid' is not changed Assert.IsTrue (Double.IsNaN (c.TemplateGrid.Width), "#10"); } ); }