// begins an animated self transition private void _beginAnimatedSelfTransition(Transition transition, Action onComplete) { InTransition = true; CoerceValue(ClipToBoundsProperty); _transitionData = new TransitionEventArgs(TransitionPanel.TransitionStartedEvent, this) { Bounds = RenderSize, OldContent = FrontLayer.Content, NewContent = FrontLayer.Content, Transition = transition }; _transitionData.BackSnapshot = _selfTransitionSnapshot; _transitionData.FrontSnapshot = _captureSnapshot(FrontLayer, true); _transitionData.OnCompleteCallback = () => { _onCompleteAnimatedTransition(_transitionData); if (onComplete != null) onComplete(); }; RaiseEvent(_transitionData); transition.InvokeBeginTransition(_transitionData); }
// begins an animated transition private void _beginAnimatedTransition(Transition transition, Action onComplete) { // swap the front and back layers (without adding and removing them from the visual tree to avoid superfluous loaded/unloaded events) _flipLayers = !_flipLayers; // set the front layer's content FrontLayer.Content = Content; FrontLayer.ContentTemplate = ContentTemplate; FrontLayer.ContentTemplateSelector = ContentTemplateSelector; // start the transition from back layer to front layer InTransition = true; CoerceValue(ClipToBoundsProperty); _transitionData = new TransitionEventArgs(TransitionPanel.TransitionStartedEvent, this) { Bounds = RenderSize, OldContent = BackLayer.Content, NewContent = FrontLayer.Content, Transition = transition }; _transitionData.OnCompleteCallback = () => { _onCompleteAnimatedTransition(_transitionData); if (onComplete != null) onComplete(); }; Action invokeTransition = () => { _transitionData.BackSnapshot = _captureSnapshot(BackLayer, true); _transitionData.FrontSnapshot = _captureSnapshot(FrontLayer, true); transition.InvokeBeginTransition(_transitionData); }; RaiseEvent(_transitionData); if ((Content is DependencyObject) && GetHasNestedTransitionPanel((DependencyObject)Content)) { // if content has a nested transition panel, use a timer to allow the nested transition panel to draw its initial state before the // enclosing transition is started to avoid seeing a blank panel during the transition var timer = new GuiTimer(DispatcherPriority.Background); timer.Start(t => invokeTransition()); } else { invokeTransition(); } }