async Task PopModalInternal(bool animated) { TaskCompletionSource <bool> tcs = null; if (CurrentModalNavigationTask != null && !CurrentModalNavigationTask.IsCompleted) { var previousTask = CurrentModalNavigationTask; tcs = new TaskCompletionSource <bool>(); CurrentModalNavigationTask = tcs.Task; await previousTask; } if (animated) { InternalNaviframe.Pop(); } else { InternalNaviframe.NavigationStack.LastOrDefault()?.Delete(); } bool shouldWait = animated && (InternalNaviframe.NavigationStack.Count != 0); await WaitForCompletion(shouldWait, tcs); }
async Task PushModalInternal(Page modal, bool animated) { TaskCompletionSource <bool> tcs = null; if (CurrentModalNavigationTask != null && !CurrentModalNavigationTask.IsCompleted) { var previousTask = CurrentModalNavigationTask; tcs = new TaskCompletionSource <bool>(); CurrentModalNavigationTask = tcs.Task; await previousTask; } var after = InternalNaviframe.NavigationStack.LastOrDefault(); NaviItem pushed = null; if (animated || after == null) { pushed = InternalNaviframe.Push(Platform.GetOrCreateRenderer(modal).NativeView, modal.Title); } else { pushed = InternalNaviframe.InsertAfter(after, Platform.GetOrCreateRenderer(modal).NativeView, modal.Title); } pushed.TitleBarVisible = false; bool shouldWait = animated && after != null; await WaitForCompletion(shouldWait, tcs); }
protected virtual void Dispose(bool disposing) { if (_disposed) { return; } if (disposing) { SetPage(null); InternalNaviframe.Unrealize(); } _disposed = true; }
public void SetPage(Page newRoot) { if (Page != null) { var copyOfStack = new List <NaviItem>(InternalNaviframe.NavigationStack); for (var i = 0; i < copyOfStack.Count; i++) { copyOfStack[i].Delete(); } foreach (Page page in _navModel.Roots) { var renderer = GetRenderer(page); (page as IPageController)?.SendDisappearing(); renderer?.Dispose(); } _navModel = new NavigationModel(); } if (newRoot == null) { return; } _navModel.Push(newRoot, null); Page = newRoot; Page.Platform = this; IVisualElementRenderer pageRenderer = AttachRenderer(Page); var naviItem = InternalNaviframe.Push(pageRenderer.NativeView); naviItem.TitleBarVisible = false; // Make naviitem transparent if parent window is transparent. // Make sure that this is only for _navModel._naviTree. (not for _navModel._modalStack) // In addtion, the style of naviItem is only decided before the naviItem pushed into Naviframe. (not on-demand). if (HasAlpha) { naviItem.Style = "default/transparent"; } ((Application)Page.RealParent).NavigationProxy.Inner = this; Device.StartTimer(TimeSpan.Zero, () => { CurrentPageController?.SendAppearing(); return(false); }); }