summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Core
diff options
context:
space:
mode:
authorE.Z. Hart <hartez@users.noreply.github.com>2017-01-23 12:42:38 -0700
committerKangho Hur <kangho.hur@samsung.com>2017-03-24 13:12:24 +0900
commit8ac2874b55a3f331abb58fa983b8603e08b80184 (patch)
tree8dd3a2305b3bd1eac8ee01fac37a15e6aa4ee0d0 /Xamarin.Forms.Core
parentb57d4e67779bc67070e90b23167a01e37c3a2f8a (diff)
downloadxamarin-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.cs4
-rw-r--r--Xamarin.Forms.Core/NavigationPage.cs19
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; }