public async Task Navigate(NavigateInfo info) { if (info?.PageType != null && LockNavigation()) { switch (info.Mode) { case NavigateMode.Default: CurrentSectionRootPageType = NavigationHelper.GetSectionRootPageTypeForPage(info.PageType); var page = info.CreatePage(); await _navigation.PushAsync(page); break; case NavigateMode.RemovePrevious: case NavigateMode.RemoveAllPrevious: CurrentSectionRootPageType = NavigationHelper.GetSectionRootPageTypeForPage(info.PageType); page = info.CreatePage(); await _navigation.PushAsync(page); var numberPagesToRemove = info.Mode == NavigateMode.RemovePrevious ? (int?)(info.NavigateParam as int? ?? 1) : null; while ((numberPagesToRemove == null || numberPagesToRemove > 0) && _navigation.NavigationStack.Count > 1) { _navigation.RemovePage(_navigation.NavigationStack[_navigation.NavigationStack.Count - 2]); if (numberPagesToRemove != null) { numberPagesToRemove--; } } break; case NavigateMode.ToSectionRoot: var last = _navigation.NavigationStack.LastOrDefault(); if (last == null || last.GetType() != info.PageType) { CurrentSectionRootPageType = info.PageType; page = _navigation.NavigationStack.FirstOrDefault(p => p.GetType() == info.PageType) as BasePage; if (page != null) { var i = _navigation.NavigationStack.Count - 2; var pageForRemove = _navigation.NavigationStack[i]; while (pageForRemove != page) { _navigation.RemovePage(pageForRemove); pageForRemove = _navigation.NavigationStack[--i]; } await _navigation.PopAsync(); } else { await _navigation.PushAsync(info.CreatePage()); } } break; case NavigateMode.Modal: var modalPage = info.CreateModalPage(); await _navigation.PushModalAsync(modalPage); break; } UnlockNavigation(); } }
private async void ExecuteNavigateCommand(NavigateInfo info) { await Navigate(info); }