private async Task <bool> RaisePageOnNavigatingFromAsync(MtPageDescription currentPage, MtPageDescription nextPage, NavigationMode mode) { var page = currentPage.GetPage(this); var args = new MtNavigatingCancelEventArgs(); args.Content = page; args.SourcePageType = currentPage.Type; args.NavigationMode = mode; args.Parameter = currentPage.Parameter; await page.OnNavigatingFromCoreAsync(args); if (!args.Cancel && nextPage != null) { var args2 = new MtNavigatingCancelEventArgs(); args2.SourcePageType = nextPage.Type; args2.NavigationMode = mode; args2.Parameter = nextPage.Parameter; var copy = Navigating; if (copy != null) { copy(this, args2); args.Cancel = args2.Cancel; } } return(args.Cancel); }
private async Task <bool> NavigateAsync(MtPageDescription newPage) { try { IsNavigating = true; var currentPage = CurrentPage; if (currentPage != null) { if (await RaisePageOnNavigatingFromAsync(CurrentPage, newPage, NavigationMode.New)) { return(false); } } RemoveForwardStack(); await NavigateWithAnimationsAndCallbacksAsync(NavigationMode.New, currentPage, newPage, CurrentIndex + 1); return(true); } finally { IsNavigating = false; } }
private void ReleasePageIfNecessary(MtPageDescription page) { if (page != null && (page.Page.NavigationCacheMode == NavigationCacheMode.Disabled || DisableCache)) { page.ReleasePage(); } }
private void RaisePageOnNavigatedTo(MtPageDescription description, NavigationMode mode) { var page = description.GetPage(this); var args = new MtNavigationEventArgs(); args.Content = page; args.SourcePageType = description.Type; args.Parameter = description.Parameter; args.NavigationMode = mode; page.OnNavigatedToCore(args); var copy = Navigated; if (copy != null) { copy(this, args); } OnNavigated(this, args); if (args.NavigationMode == NavigationMode.New) { OnPageCreated(this, page); } }
private void SwitchPagesIfSequential(PageInsertionMode insertionMode, MtPageDescription currentPage, MtPageDescription newPage) { if (insertionMode == PageInsertionMode.Sequential) { if (currentPage != null) { ContentGrid.Children.Remove(currentPage.GetPage(this).InternalPage); } ContentGrid.Children.Add(newPage.GetPage(this).InternalPage); } }
/// <summary>Removes a page from the page stack. </summary> /// <param name="pageDescription">The page to remove. </param> /// <returns><c>true</c> if the page has been found and was removed; otherwise, <c>false</c>. </returns> /// <exception cref="ArgumentException">The current page cannot be removed from the stack. </exception> public bool RemovePageFromStack(MtPageDescription pageDescription) { var index = _pages.IndexOf(pageDescription); if (index >= 0) { RemovePageFromStackAt(index); return(true); } return(false); }
private void ChangeCurrentPageAndRaiseNavigationEvents(NavigationMode navigationMode, MtPageDescription currentPage, MtPageDescription newPage, int nextPageIndex) { if (currentPage != null) { RaisePageOnNavigatedFrom(currentPage, navigationMode); } _pageStackManager.ChangeCurrentPage(newPage, nextPageIndex); RaisePageOnNavigatedTo(newPage, navigationMode); ((CommandBase)GoBackCommand).RaiseCanExecuteChanged(); }
private void RaisePageOnNavigatedFrom(MtPageDescription description, NavigationMode mode) { var page = description.GetPage(this); var args = new MtNavigationEventArgs(); args.Content = page; args.SourcePageType = description.Type; args.Parameter = description.Parameter; args.NavigationMode = mode; page.OnNavigatedFromCore(args); }
private async Task <bool> RaisePageOnNavigatingFromAsync(MtPageDescription description, NavigationMode mode) { var page = description.GetPage(this); var args = new MtNavigatingCancelEventArgs(); args.Content = page; args.SourcePageType = description.Type; args.NavigationMode = mode; IsNavigating = true; await page.OnNavigatingFromCoreAsync(args); IsNavigating = false; return(args.Cancel); }
/// <summary>Navigates forward to a new instance of the given page type. </summary> /// <param name="pageType">The page type. </param> /// <param name="parameter">The page parameter. </param> /// <returns>Returns true if the navigation process has not been cancelled. </returns> public async Task <bool> NavigateAsync(Type pageType, object parameter) { var currentPage = CurrentPage; if (currentPage != null && await RaisePageOnNavigatingFromAsync(CurrentPage, NavigationMode.New)) { return(false); } RemoveForwardStack(); var newPage = new MtPageDescription(pageType, parameter); await NavigateWithAnimationsAndCallbacksAsync(NavigationMode.New, currentPage, newPage, _currentIndex + 1); return(true); }
private void ChangeCurrentPageAndRaiseNavigationEvents(NavigationMode navigationMode, MtPageDescription currentPage, MtPageDescription newPage, int nextPageIndex) { if (currentPage != null) { RaisePageOnNavigatedFrom(currentPage, navigationMode); } if (navigationMode == NavigationMode.New) { _pages.Add(newPage); } CurrentIndex = nextPageIndex; RaisePageOnNavigatedTo(newPage, navigationMode); ((CommandBase)GoBackCommand).RaiseCanExecuteChanged(); }
/// <summary>Navigates to the given page and copies the page.</summary> /// <param name="page">The page.</param> /// <returns>True if page is now on top of the stack, false when navigation from the current page failed.</returns> public async Task <bool> CopyToTopAndNavigateAsync(MtPageDescription page) { if (CurrentPage == page) { return(true); } if (_pageStackManager.Pages.Contains(page)) { if (await NavigateAsync(page, NavigationMode.Forward)) { return(true); } } return(false); }
private Task <bool> NavigateAsync(MtPageDescription newPage, NavigationMode navigationMode) { return(RunNavigationWithCheckAsync(async() => { var currentPage = CurrentPage; if (currentPage != null) { if (await RaisePageOnNavigatingFromAsync(CurrentPage, newPage, navigationMode)) { return false; } } _pageStackManager.ClearForwardStack(); await NavigateWithAnimationsAndCallbacksAsync(navigationMode, currentPage, newPage, _pageStackManager.CurrentIndex + 1); return true; })); }
private async Task NavigateWithAnimationsAndCallbacksAsync(NavigationMode navigationMode, MtPageDescription currentPage, MtPageDescription nextPage, int nextPageIndex) { var pageAnimation = ActualPageAnimation; var insertionMode = pageAnimation != null ? pageAnimation.PageInsertionMode : PageInsertionMode.Sequential; ContentGrid.IsHitTestVisible = false; AddNewPageToGridIfNotSequential(insertionMode, nextPage); await AnimateNavigatedFromIfCurrentPageNotNull(pageAnimation, navigationMode, insertionMode, currentPage, nextPage); SwitchPagesIfSequential(insertionMode, currentPage, nextPage); ChangeCurrentPageAndRaiseNavigationEvents(navigationMode, currentPage, nextPage, nextPageIndex); await AnimateNavigatedToAndRemoveCurrentPageAsync(pageAnimation, navigationMode, insertionMode, currentPage, nextPage); ContentGrid.IsHitTestVisible = true; ReleasePageIfNecessary(currentPage); }
/// <summary>Navigates to the given page and removes the page from the previous position in the page stack.</summary> /// <param name="page">The page.</param> /// <returns>True if page is now on top of the stack, false when navigation from the current page failed.</returns> public async Task <bool> MoveToTopAndNavigateAsync(MtPageDescription page) { if (CurrentPage == page) { return(true); } var index = _pages.IndexOf(page); if (index != -1) { _pages.RemoveAt(index); _currentIndex--; if (await NavigateAsync(page)) { return(true); } _pages.Insert(index, page); } return(false); }
private async Task<bool> RaisePageOnNavigatingFromAsync(MtPageDescription description, NavigationMode mode) { var page = description.GetPage(this); var args = new MtNavigatingCancelEventArgs(); args.Content = page; args.SourcePageType = description.Type; args.NavigationMode = mode; IsNavigating = true; await page.OnNavigatingFromCoreAsync(args); IsNavigating = false; return args.Cancel; }
private async Task AnimateNavigatedToAndRemoveCurrentPageAsync(IPageAnimation pageAnimation, NavigationMode navigationMode, PageInsertionMode insertionMode, MtPageDescription currentPage, MtPageDescription newPage) { if (currentPage != null) { if (insertionMode != PageInsertionMode.Sequential) { await AnimateNavigatedToAsync(pageAnimation, navigationMode, currentPage.GetPage(this).ActualAnimationContext, newPage.GetPage(this).ActualAnimationContext); ContentGrid.Children.Remove(currentPage.GetPage(this).InternalPage); } else { await AnimateNavigatedToAsync(pageAnimation, navigationMode, null, newPage.GetPage(this).ActualAnimationContext); } } }
private void ChangeCurrentPageAndRaiseNavigationEvents(NavigationMode navigationMode, MtPageDescription currentPage, MtPageDescription newPage, int nextPageIndex) { if (currentPage != null) RaisePageOnNavigatedFrom(currentPage, navigationMode); if (navigationMode == NavigationMode.New) _pages.Add(newPage); CurrentIndex = nextPageIndex; RaisePageOnNavigatedTo(newPage, navigationMode); ((RelayCommand)GoBackCommand).RaiseCanExecuteChanged(); }
private void AddNewPageToGridIfNotSequential(PageInsertionMode insertionMode, MtPageDescription newPage) { if (insertionMode == PageInsertionMode.ConcurrentAbove) ContentGrid.Children.Add(newPage.GetPage(this).InternalPage); else if (insertionMode == PageInsertionMode.ConcurrentBelow) ContentGrid.Children.Insert(0, newPage.GetPage(this).InternalPage); }
/// <summary>Navigates back to the given page. </summary> /// <param name="pageDescription">The page to navigate to. </param> /// <returns>True if the navigation could be performed. </returns> public async Task<bool> GoBackToAsync(MtPageDescription pageDescription) { var index = _pages.IndexOf(pageDescription); return await GoBackToAsync(index); }
/// <summary>Navigates to the given page and removes the page from the previous position in the page stack.</summary> /// <param name="page">The page.</param> /// <returns>True if page is now on top of the stack, false when navigation from the current page failed.</returns> public Task<bool> MoveToTopAndNavigateAsync(MtPageDescription page) { return _pageStackManager.MoveToTop(page, async p => await NavigateAsync(p, NavigationMode.Forward)); }
/// <summary>Navigates to the given page and removes the page from the previous position in the page stack.</summary> /// <param name="page">The page.</param> /// <returns>True if page is now on top of the stack, false when navigation from the current page failed.</returns> public Task <bool> MoveToTopAndNavigateAsync(MtPageDescription page) { return(_pageStackManager.MoveToTop(page, async p => await NavigateAsync(p, NavigationMode.Forward))); }
/// <summary>Navigates forward to a new instance of the given page type.</summary> /// <param name="pageType">The page type. </param> /// <param name="parameter">The page parameter. </param> /// <returns>Returns true if the navigation process has not been cancelled. </returns> public async Task <bool> NavigateAsync(Type pageType, object parameter) { var newPage = new MtPageDescription(pageType, parameter); return(await NavigateAsync(newPage, NavigationMode.New)); }
/// <summary>Removes a page from the page stack. </summary> /// <param name="pageDescription">The page to remove. </param> /// <returns><c>true</c> if the page has been found and was removed; otherwise, <c>false</c>. </returns> /// <exception cref="ArgumentException">The current page cannot be removed from the stack. </exception> public bool RemovePageFromStack(MtPageDescription pageDescription) { return(_pageStackManager.RemovePageFromStack(pageDescription)); }
/// <summary>Navigates back to the given page. </summary> /// <param name="pageDescription">The page to navigate to. </param> /// <returns>True if the navigation could be performed. </returns> public async Task <bool> GoBackToAsync(MtPageDescription pageDescription) { var index = _pageStackManager.GetPageIndex(pageDescription); return(await GoBackToAsync(index)); }
/// <summary>Navigates to the given page and removes the page from the previous position in the page stack.</summary> /// <param name="page">The page.</param> /// <returns>True if page is now on top of the stack, false when navigation from the current page failed.</returns> public async Task<bool> MoveToTopAndNavigateAsync(MtPageDescription page) { if (CurrentPage == page) return true; var index = _pages.IndexOf(page); if (index != -1) { _pages.RemoveAt(index); _currentIndex--; if (await NavigateAsync(page)) return true; _pages.Insert(index, page); } return false; }
private async Task<bool> NavigateAsync(MtPageDescription newPage) { try { IsNavigating = true; var currentPage = CurrentPage; if (currentPage != null) { if (await RaisePageOnNavigatingFromAsync(CurrentPage, newPage, NavigationMode.New)) return false; } RemoveForwardStack(); await NavigateWithAnimationsAndCallbacksAsync(NavigationMode.New, currentPage, newPage, CurrentIndex + 1); return true; } finally { IsNavigating = false; } }
private async Task<bool> RaisePageOnNavigatingFromAsync(MtPageDescription currentPage, MtPageDescription targetPage, NavigationMode mode) { var page = currentPage.GetPage(this); var args = new MtNavigatingCancelEventArgs(); args.Content = page; args.SourcePageType = currentPage.Type; args.NavigationMode = mode; args.Parameter = currentPage.Parameter; await page.OnNavigatingFromCoreAsync(args); if (!args.Cancel && targetPage != null) { var args2 = new MtNavigatingCancelEventArgs(); args2.SourcePageType = targetPage.Type; args2.NavigationMode = mode; args2.Parameter = targetPage.Parameter; var copy = Navigating; if (copy != null) { copy(this, args2); args.Cancel = args2.Cancel; } } return args.Cancel; }
/// <exception cref="ArgumentException">The current page cannot be removed from the stack. </exception> public bool RemovePageFromStack(MtPageDescription pageDescription) { var index = GetPageIndex(pageDescription); if (index >= 0) { RemovePageFromStackAt(index); return true; } return false; }
/// <summary>Navigates forward to a new instance of the given page type. </summary> /// <param name="pageType">The page type. </param> /// <param name="parameter">The page parameter. </param> /// <returns>Returns true if the navigation process has not been cancelled. </returns> public async Task<bool> NavigateAsync(Type pageType, object parameter) { var newPage = new MtPageDescription(pageType, parameter); return await NavigateAsync(newPage); }
public void ChangeCurrentPage(MtPageDescription newPage, int nextPageIndex) { if (_pages.Count <= nextPageIndex) _pages.Add(newPage); CurrentIndex = nextPageIndex; }
/// <summary>Removes a page from the page stack. </summary> /// <param name="pageDescription">The page to remove. </param> /// <returns><c>true</c> if the page has been found and was removed; otherwise, <c>false</c>. </returns> /// <exception cref="ArgumentException">The current page cannot be removed from the stack. </exception> public bool RemovePageFromStack(MtPageDescription pageDescription) { return _pageStackManager.RemovePageFromStack(pageDescription); }
/// <summary>Navigates back to the given page. </summary> /// <param name="pageDescription">The page to navigate to. </param> /// <returns>True if the navigation could be performed. </returns> public async Task<bool> GoBackToAsync(MtPageDescription pageDescription) { var index = _pageStackManager.GetPageIndex(pageDescription); return await GoBackToAsync(index); }
/// <summary>Navigates forward to a new instance of the given page type. </summary> /// <param name="pageType">The page type. </param> /// <param name="parameter">The page parameter. </param> /// <returns>Returns true if the navigation process has not been cancelled. </returns> public async Task<bool> NavigateAsync(Type pageType, object parameter) { var currentPage = CurrentPage; if (currentPage != null && await RaisePageOnNavigatingFromAsync(CurrentPage, NavigationMode.New)) return false; RemoveForwardStack(); var newPage = new MtPageDescription(pageType, parameter); await NavigateWithAnimationsAndCallbacksAsync(NavigationMode.New, currentPage, newPage, CurrentIndex + 1); return true; }
private void ChangeCurrentPageAndRaiseNavigationEvents(NavigationMode navigationMode, MtPageDescription currentPage, MtPageDescription newPage, int nextPageIndex) { if (currentPage != null) RaisePageOnNavigatedFrom(currentPage, navigationMode); _pageStackManager.ChangeCurrentPage(newPage, nextPageIndex); RaisePageOnNavigatedTo(newPage, navigationMode); ((CommandBase)GoBackCommand).RaiseCanExecuteChanged(); }
private void ReleasePageIfNecessary(MtPageDescription page) { if (page != null && (page.Page.NavigationCacheMode == NavigationCacheMode.Disabled || DisableCache)) page.ReleasePage(); }
private void AddNewPageToGridIfNotSequential(PageInsertionMode insertionMode, MtPageDescription newPage) { var page = newPage.GetPage(this).InternalPage; if (!ContentGrid.Children.Contains(page)) { if (insertionMode == PageInsertionMode.ConcurrentAbove) { ContentGrid.Children.Add(page); } else if (insertionMode == PageInsertionMode.ConcurrentBelow) { ContentGrid.Children.Insert(0, page); } } }
private async Task AnimateNavigatedFromIfCurrentPageNotNull(IPageAnimation pageAnimation, NavigationMode navigationMode, PageInsertionMode insertionMode, MtPageDescription currentPage, MtPageDescription newPage) { if (currentPage != null) { if (insertionMode != PageInsertionMode.Sequential) { await AnimateNavigatingFromAsync(pageAnimation, navigationMode, currentPage.GetPage(this).ActualAnimationContext, insertionMode != PageInsertionMode.Sequential ? newPage.GetPage(this).ActualAnimationContext : null); } else { await AnimateNavigatingFromAsync(pageAnimation, navigationMode, currentPage.GetPage(this).ActualAnimationContext, null); } } }
private Task<bool> NavigateAsync(MtPageDescription newPage, NavigationMode navigationMode) { return RunNavigationWithCheckAsync(async () => { var currentPage = CurrentPage; if (currentPage != null) { if (await RaisePageOnNavigatingFromAsync(CurrentPage, newPage, navigationMode)) return false; } _pageStackManager.ClearForwardStack(); await NavigateWithAnimationsAndCallbacksAsync(navigationMode, currentPage, newPage, _pageStackManager.CurrentIndex + 1); return true; }); }
private void SwitchPagesIfSequential(PageInsertionMode insertionMode, MtPageDescription currentPage, MtPageDescription newPage) { if (insertionMode == PageInsertionMode.Sequential) { if (currentPage != null) ContentGrid.Children.Remove(currentPage.GetPage(this).InternalPage); ContentGrid.Children.Add(newPage.GetPage(this).InternalPage); } }
private async Task AnimateNavigatedFromIfCurrentPageNotNull(IPageAnimation pageAnimation, NavigationMode navigationMode, PageInsertionMode insertionMode, MtPageDescription currentPage, MtPageDescription newPage) { if (currentPage != null) { if (insertionMode != PageInsertionMode.Sequential) { await AnimateNavigatingFromAsync(pageAnimation, navigationMode, currentPage.GetPage(this).ActualAnimationContext, insertionMode != PageInsertionMode.Sequential?newPage.GetPage(this).ActualAnimationContext : null); } else { await AnimateNavigatingFromAsync(pageAnimation, navigationMode, currentPage.GetPage(this).ActualAnimationContext, null); } } }
internal void RaisePageOnNavigatedFrom(MtPageDescription description, NavigationMode mode) { var page = description.GetPage(this); var args = new MtNavigationEventArgs(); args.Content = page; args.SourcePageType = description.Type; args.Parameter = description.Parameter; args.NavigationMode = mode; page.OnNavigatedFromCore(args); }
private void RaisePageOnNavigatedTo(MtPageDescription description, NavigationMode mode) { var page = description.GetPage(this); var args = new MtNavigationEventArgs(); args.Content = page; args.SourcePageType = description.Type; args.Parameter = description.Parameter; args.NavigationMode = mode; page.OnNavigatedToCore(args); var copy = Navigated; if (copy != null) copy(this, args); OnNavigated(this, args); if (args.NavigationMode == NavigationMode.New) OnPageCreated(this, page); }
/// <summary>Navigates to the given page and copies the page.</summary> /// <param name="page">The page.</param> /// <returns>True if page is now on top of the stack, false when navigation from the current page failed.</returns> public async Task<bool> CopyToTopAndNavigateAsync(MtPageDescription page) { if (CurrentPage == page) return true; if (_pageStackManager.Pages.Contains(page)) { if (await NavigateAsync(page, NavigationMode.Forward)) return true; } return false; }
public async Task<bool> MoveToTop(MtPageDescription page, Func<MtPageDescription, Task<bool>> action) { if (CurrentPage == page) return true; var index = _pages.IndexOf(page); if (index != -1) { _pages.RemoveAt(index); _currentIndex--; if (await action(page)) return true; _pages.Insert(index, page); } return false; }
/// <summary>Navigates back to the given page. </summary> /// <param name="pageDescription">The page to navigate to. </param> /// <returns>True if the navigation could be performed. </returns> public async Task <bool> GoBackToAsync(MtPageDescription pageDescription) { var index = _pages.IndexOf(pageDescription); return(await GoBackToAsync(index)); }
public int GetPageIndex(MtPageDescription pageDescription) { return _pages.IndexOf(pageDescription); }
/// <summary>Determines whether the HamburgerItem represents the given page description.</summary> /// <param name="item">The hamburger item.</param> /// <param name="pageDescription">The page description.</param> /// <returns>true or false.</returns> protected virtual bool IsHamburgerItemForPage(HamburgerItem item, MtPageDescription pageDescription) { return(item is PageHamburgerItem && ((PageHamburgerItem)item).PageType == pageDescription.Type); }