From 8ac2874b55a3f331abb58fa983b8603e08b80184 Mon Sep 17 00:00:00 2001 From: "E.Z. Hart" Date: Mon, 23 Jan 2017 12:42:38 -0700 Subject: Reduce overhead of pushing existing navigation stack (#672) * Make StackCopy less awkward * Clean up comment * Update docs * Update docs * Replace SecondToLast with an arbitrarily deep Peek method * Update docs * Handle negative depths in Peek() --- Xamarin.Forms.Core/INavigationPageController.cs | 4 +++- Xamarin.Forms.Core/NavigationPage.cs | 19 +++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) (limited to 'Xamarin.Forms.Core') diff --git a/Xamarin.Forms.Core/INavigationPageController.cs b/Xamarin.Forms.Core/INavigationPageController.cs index eddbe750..d4ae8675 100644 --- a/Xamarin.Forms.Core/INavigationPageController.cs +++ b/Xamarin.Forms.Core/INavigationPageController.cs @@ -7,7 +7,9 @@ namespace Xamarin.Forms { public interface INavigationPageController { - Stack StackCopy { get; } + Page Peek(int depth); + + IEnumerable Pages { get; } int StackDepth { get; } diff --git a/Xamarin.Forms.Core/NavigationPage.cs b/Xamarin.Forms.Core/NavigationPage.cs index 7b393b9c..fdafec06 100644 --- a/Xamarin.Forms.Core/NavigationPage.cs +++ b/Xamarin.Forms.Core/NavigationPage.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Linq; using System.Threading.Tasks; using Xamarin.Forms.Internals; @@ -61,17 +62,23 @@ namespace Xamarin.Forms internal Task CurrentNavigationTask { get; set; } - Stack INavigationPageController.StackCopy + Page INavigationPageController.Peek(int depth) { - get + if (depth < 0) { - var result = new Stack(PageController.InternalChildren.Count); - foreach (Page page in PageController.InternalChildren) - result.Push(page); - return result; + return null; } + + if (PageController.InternalChildren.Count <= depth) + { + return null; + } + + return (Page)PageController.InternalChildren[PageController.InternalChildren.Count - depth - 1]; } + IEnumerable INavigationPageController.Pages => PageController.InternalChildren.Cast(); + int INavigationPageController.StackDepth { get { return PageController.InternalChildren.Count; } -- cgit v1.2.3