diff options
author | E.Z. Hart <hartez@users.noreply.github.com> | 2017-01-23 12:42:38 -0700 |
---|---|---|
committer | Kangho Hur <kangho.hur@samsung.com> | 2017-03-24 13:12:24 +0900 |
commit | 8ac2874b55a3f331abb58fa983b8603e08b80184 (patch) | |
tree | 8dd3a2305b3bd1eac8ee01fac37a15e6aa4ee0d0 /Xamarin.Forms.Core | |
parent | b57d4e67779bc67070e90b23167a01e37c3a2f8a (diff) | |
download | xamarin-forms-8ac2874b55a3f331abb58fa983b8603e08b80184.tar.gz xamarin-forms-8ac2874b55a3f331abb58fa983b8603e08b80184.tar.bz2 xamarin-forms-8ac2874b55a3f331abb58fa983b8603e08b80184.zip |
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()
Diffstat (limited to 'Xamarin.Forms.Core')
-rw-r--r-- | Xamarin.Forms.Core/INavigationPageController.cs | 4 | ||||
-rw-r--r-- | Xamarin.Forms.Core/NavigationPage.cs | 19 |
2 files changed, 16 insertions, 7 deletions
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<Page> StackCopy { get; } + Page Peek(int depth); + + IEnumerable<Page> 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<Page> INavigationPageController.StackCopy + Page INavigationPageController.Peek(int depth) { - get + if (depth < 0) { - var result = new Stack<Page>(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<Page> INavigationPageController.Pages => PageController.InternalChildren.Cast<Page>(); + int INavigationPageController.StackDepth { get { return PageController.InternalChildren.Count; } |