예제 #1
0
 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);
 }
예제 #2
0
        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);
        }
예제 #3
0
        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;
            }
        }