public void Navigate(TPageIdentifier page, NavigationBackstackOption backstackOption, object args = null) { if (Interceptor != null) { page = Interceptor(page); } Navigated?.Invoke(this, page); CurrentPage = page; ResolveStackManager(page).Navigate(page, backstackOption, args); }
public void Navigate(TPageIdentifier page, NavigationBackstackOption backstackOption, object args = null) { // We gotta clean all entries on backstack until we find the desired one if (backstackOption == NavigationBackstackOption.ClearBackstackToFirstOccurence) { if (_stack.Any(entry => entry.Page.PageIdentifier.Equals(page))) { var poppedPages = new List <TPage>(); var top = _stack.Pop(); var provider = _navigationManager.PageDefinitions[page]; while (!top.Page.PageIdentifier.Equals(provider.PageIdentifier)) { if (top.Page != null) { poppedPages.Add(top.Page); } if (!_stack.Any()) { break; } top = _stack.Pop(); } CurrentFragment?.NavigatedFrom(); _navigationManager.NotifyPagesPopped(poppedPages); CurrentFragment = null; } else { backstackOption = NavigationBackstackOption.SetAsRootPage; } } // before navigation new page instance will be created if (backstackOption == NavigationBackstackOption.ForceNewPageInstance) { _navigationManager.PageDefinitions[page].ForceReinstantination(); } else if (backstackOption == NavigationBackstackOption.SetAsRootPage) { _stack.Clear(); CurrentFragment?.NavigatedFrom(); _navigationManager.NotifyStackCleared(); CurrentFragment = null; } _currentBackstackOption = backstackOption; Navigate(page, args); }
public void TestNavigationWithBackstackOptions(NavigationBackstackOption backstackOption) { // Arrange var savedPageB = _pageB; // Act _stackManager.Navigate(PageIndex.PageA); _stackManager.Navigate(PageIndex.PageA); _stackManager.Navigate(PageIndex.PageB); _stackManager.Navigate(PageIndex.PageA); _stackManager.Navigate(PageIndex.PageA); _stackManager.Navigate(PageIndex.PageB, backstackOption); var pageList = _stack.Select(entry => (PageIndex)entry.Page.PageIdentifier).ToList(); switch (backstackOption) { case NavigationBackstackOption.SetAsRootPage: Assert.Equal(new PageIndex[0], pageList); _navigationManager.Verify(manager => manager.NotifyStackCleared(), Times.Once); break; case NavigationBackstackOption.ClearBackstackToFirstOccurence: _navigationManager .Verify( manager => manager.NotifyPagesPopped(It.Is <IEnumerable <INavigationPage> >(pages => pages.ToArray()[0] == _pageA.Object && pages.Count() == 1)), Times.Once); Assert.Equal(new[] { PageIndex.PageA, PageIndex.PageA }, pageList); break; case NavigationBackstackOption.NoBackstack: Assert.Equal(new[] { PageIndex.PageA, PageIndex.PageB, PageIndex.PageA, PageIndex.PageA }, pageList); break; case NavigationBackstackOption.ForceNewPageInstance: Assert.NotEqual(_pageDefinitions[PageIndex.PageB].Page, savedPageB.Object); break; } }