internal Task SetCurrent(Page page, bool animated, bool popping = false, Action completedCallback = null) { var tcs = new TaskCompletionSource<bool>(); if (page == _currentDisplayedPage) { tcs.SetResult(true); return tcs.Task; } if (!animated) tcs.SetResult(true); page.Platform = this; if (GetRenderer(page) == null) SetRenderer(page, CreateRenderer(page)); page.Layout(new Rectangle(0, 0, _renderer.ActualWidth, _renderer.ActualHeight)); IVisualElementRenderer pageRenderer = GetRenderer(page); if (pageRenderer != null) { ((FrameworkElement)pageRenderer.ContainerElement).Width = _renderer.ActualWidth; ((FrameworkElement)pageRenderer.ContainerElement).Height = _renderer.ActualHeight; } Page current = _currentDisplayedPage; UIElement currentElement = null; if (current != null) currentElement = (UIElement)GetRenderer(current); if (popping) { ITransition transitionOut = null; if (current != null) { if (animated) transitionOut = _backwardOutTransition.GetTransition(currentElement); else _renderer.Children.Remove(currentElement); } var pageElement = (UIElement)GetRenderer(page); if (animated) { transitionOut.Completed += (s, e) => { transitionOut.Stop(); _renderer.Children.Remove(currentElement); UpdateToolbarTracker(); _renderer.Children.Add(pageElement); ITransition transitionIn = _backwardInTransition.GetTransition(pageElement); transitionIn.Completed += (si, ei) => { transitionIn.Stop(); if (completedCallback != null) completedCallback(); tcs.SetResult(true); }; transitionIn.Begin(); }; transitionOut.Begin(); } else { UpdateToolbarTracker(); _renderer.Children.Add(pageElement); if (completedCallback != null) completedCallback(); } } else { ITransition transitionOut = null; if (current != null) { if (animated) transitionOut = _forwardOutTransition.GetTransition(currentElement); else _renderer.Children.Remove(currentElement); } if (animated) { if (transitionOut != null) { transitionOut.Completed += (o, e) => { _renderer.Children.Remove(currentElement); transitionOut.Stop(); UpdateToolbarTracker(); var element = (UIElement)GetRenderer(page); _renderer.Children.Add(element); ITransition transitionIn = _forwardInTransition.GetTransition(element); transitionIn.Completed += (s, ie) => { transitionIn.Stop(); if (completedCallback != null) completedCallback(); tcs.SetResult(true); }; transitionIn.Begin(); }; transitionOut.Begin(); } else { UpdateToolbarTracker(); _renderer.Children.Add((UIElement)GetRenderer(page)); ITransition transitionIn = _forwardInTransition.GetTransition((UIElement)GetRenderer(page)); transitionIn.Completed += (s, e) => { transitionIn.Stop(); if (completedCallback != null) completedCallback(); tcs.SetResult(true); }; transitionIn.Begin(); } } else { _renderer.Children.Add((UIElement)GetRenderer(page)); UpdateToolbarTracker(); if (completedCallback != null) completedCallback(); } } _currentDisplayedPage = page; return tcs.Task; }