private static bool GoToStateInternal(FrameworkElement control, FrameworkElement stateGroupsRoot, VisualStateGroup group, VisualState state, bool useTransitions) { if (stateGroupsRoot == null) { throw new ArgumentNullException("stateGroupsRoot"); } if (state == null) { throw new ArgumentNullException("state"); } if (group == null) { throw new InvalidOperationException(); } VisualState lastState = group.CurrentState; if (lastState == state) { return(true); } // Get the transition Storyboard. Even if there are no transitions specified, there might // be properties that we're rolling back to their default values. VisualTransition transition = useTransitions ? VisualStateManager.GetTransition(stateGroupsRoot, group, lastState, state) : null; // Generate dynamicTransition Storyboard Storyboard dynamicTransition = GenerateDynamicTransitionAnimations(stateGroupsRoot, group, state, transition); // If the transition is null, then we want to instantly snap. The dynamicTransition will // consist of everything that is being moved back to the default state. // If the transition.Duration and explicit storyboard duration is zero, then we want both the dynamic // and state Storyboards to happen in the same tick, so we start them at the same time. if (transition == null || (transition.GeneratedDuration == DurationZero && (transition.Storyboard == null || transition.Storyboard.Duration == DurationZero))) { // Start new state Storyboard and stop any previously running Storyboards if (transition != null && transition.Storyboard != null) { group.StartNewThenStopOld(stateGroupsRoot, transition.Storyboard, state.Storyboard); } else { group.StartNewThenStopOld(stateGroupsRoot, state.Storyboard); } // Fire both CurrentStateChanging and CurrentStateChanged events group.RaiseCurrentStateChanging(stateGroupsRoot, lastState, state, control); group.RaiseCurrentStateChanged(stateGroupsRoot, lastState, state, control); } else { // In this case, we have an interstitial storyboard of duration > 0 and/or // explicit storyboard of duration >0 , so we need // to run them first, and then we'll run the state storyboard. // we have to wait for both storyboards to complete before // starting the steady state animations. transition.DynamicStoryboardCompleted = false; // Hook up generated Storyboard's Completed event handler dynamicTransition.Completed += delegate(object sender, EventArgs e) { if (transition.Storyboard == null || transition.ExplicitStoryboardCompleted) { if (ShouldRunStateStoryboard(control, stateGroupsRoot, state, group)) { group.StartNewThenStopOld(stateGroupsRoot, state.Storyboard); } group.RaiseCurrentStateChanged(stateGroupsRoot, lastState, state, control); } transition.DynamicStoryboardCompleted = true; }; if (transition.Storyboard != null && transition.ExplicitStoryboardCompleted == true) { EventHandler transitionCompleted = null; transitionCompleted = new EventHandler(delegate(object sender, EventArgs e) { if (transition.DynamicStoryboardCompleted) { if (ShouldRunStateStoryboard(control, stateGroupsRoot, state, group)) { group.StartNewThenStopOld(stateGroupsRoot, state.Storyboard); } group.RaiseCurrentStateChanged(stateGroupsRoot, lastState, state, control); } transition.Storyboard.Completed -= transitionCompleted; transition.ExplicitStoryboardCompleted = true; }); // hook up explicit storyboard's Completed event handler transition.ExplicitStoryboardCompleted = false; transition.Storyboard.Completed += transitionCompleted; } // Start transition and dynamicTransition Storyboards // Stop any previously running Storyboards group.StartNewThenStopOld(stateGroupsRoot, transition.Storyboard, dynamicTransition); group.RaiseCurrentStateChanging(stateGroupsRoot, lastState, state, control); } group.CurrentState = state; return(true); }
// Token: 0x06000CFA RID: 3322 RVA: 0x000300A4 File Offset: 0x0002E2A4 private static bool GoToStateInternal(FrameworkElement control, FrameworkElement stateGroupsRoot, VisualStateGroup group, VisualState state, bool useTransitions) { if (stateGroupsRoot == null) { throw new ArgumentNullException("stateGroupsRoot"); } if (state == null) { throw new ArgumentNullException("state"); } if (group == null) { throw new InvalidOperationException(); } VisualState lastState = group.CurrentState; if (lastState == state) { return(true); } VisualTransition transition = useTransitions ? VisualStateManager.GetTransition(stateGroupsRoot, group, lastState, state) : null; Storyboard storyboard = VisualStateManager.GenerateDynamicTransitionAnimations(stateGroupsRoot, group, state, transition); if (transition == null || (transition.GeneratedDuration == VisualStateManager.DurationZero && (transition.Storyboard == null || transition.Storyboard.Duration == VisualStateManager.DurationZero))) { if (transition != null && transition.Storyboard != null) { group.StartNewThenStopOld(stateGroupsRoot, new Storyboard[] { transition.Storyboard, state.Storyboard }); } else { group.StartNewThenStopOld(stateGroupsRoot, new Storyboard[] { state.Storyboard }); } group.RaiseCurrentStateChanging(stateGroupsRoot, lastState, state, control); group.RaiseCurrentStateChanged(stateGroupsRoot, lastState, state, control); } else { transition.DynamicStoryboardCompleted = false; storyboard.Completed += delegate(object sender, EventArgs e) { if (transition.Storyboard == null || transition.ExplicitStoryboardCompleted) { if (VisualStateManager.ShouldRunStateStoryboard(control, stateGroupsRoot, state, group)) { group.StartNewThenStopOld(stateGroupsRoot, new Storyboard[] { state.Storyboard }); } group.RaiseCurrentStateChanged(stateGroupsRoot, lastState, state, control); } transition.DynamicStoryboardCompleted = true; }; if (transition.Storyboard != null && transition.ExplicitStoryboardCompleted) { EventHandler transitionCompleted = null; transitionCompleted = delegate(object sender, EventArgs e) { if (transition.DynamicStoryboardCompleted) { if (VisualStateManager.ShouldRunStateStoryboard(control, stateGroupsRoot, state, group)) { group.StartNewThenStopOld(stateGroupsRoot, new Storyboard[] { state.Storyboard }); } group.RaiseCurrentStateChanged(stateGroupsRoot, lastState, state, control); } transition.Storyboard.Completed -= transitionCompleted; transition.ExplicitStoryboardCompleted = true; }; transition.ExplicitStoryboardCompleted = false; transition.Storyboard.Completed += transitionCompleted; } group.StartNewThenStopOld(stateGroupsRoot, new Storyboard[] { transition.Storyboard, storyboard }); group.RaiseCurrentStateChanging(stateGroupsRoot, lastState, state, control); } group.CurrentState = state; return(true); }