From a2148444bafd728090c39c1f40700b43baded1e4 Mon Sep 17 00:00:00 2001 From: "E.Z. Hart" Date: Wed, 4 May 2016 06:18:40 -0600 Subject: Add INavigationPageController (#149) --- Xamarin.Forms.Core.UnitTests/NavigationUnitTest.cs | 4 +- Xamarin.Forms.Core/INavigationPageController.cs | 26 ++++ .../Internals/NavigationRequestedEventArgs.cs | 26 ++++ Xamarin.Forms.Core/NavigationPage.cs | 71 +++++++--- Xamarin.Forms.Core/NavigationRequestedEventArgs.cs | 26 ---- Xamarin.Forms.Core/Xamarin.Forms.Core.csproj | 3 +- .../AppCompat/NavigationPageRenderer.cs | 48 ++++--- Xamarin.Forms.Platform.Android/Platform.cs | 6 +- .../Renderers/NavigationRenderer.cs | 43 +++--- .../NavigationPageRenderer.cs | 15 ++- .../NavigationPageRenderer.cs | 13 +- .../Renderers/NavigationRenderer.cs | 31 +++-- .../NavigationRequestedEventArgs.xml | 122 +++++++++++++++++ .../Xamarin.Forms/INavigationPageController.xml | 144 +++++++++++++++++++++ .../Xamarin.Forms/NavigationPage.xml | 75 ++++++++++- .../Xamarin.Forms/NavigationRequestedEventArgs.xml | 122 +++++++++++++++++ 16 files changed, 654 insertions(+), 121 deletions(-) create mode 100644 Xamarin.Forms.Core/INavigationPageController.cs create mode 100644 Xamarin.Forms.Core/Internals/NavigationRequestedEventArgs.cs delete mode 100644 Xamarin.Forms.Core/NavigationRequestedEventArgs.cs create mode 100644 docs/Xamarin.Forms.Core/Xamarin.Forms.Internals/NavigationRequestedEventArgs.xml create mode 100644 docs/Xamarin.Forms.Core/Xamarin.Forms/INavigationPageController.xml create mode 100644 docs/Xamarin.Forms.Core/Xamarin.Forms/NavigationRequestedEventArgs.xml diff --git a/Xamarin.Forms.Core.UnitTests/NavigationUnitTest.cs b/Xamarin.Forms.Core.UnitTests/NavigationUnitTest.cs index 1d3d4bd2..a6abee55 100644 --- a/Xamarin.Forms.Core.UnitTests/NavigationUnitTest.cs +++ b/Xamarin.Forms.Core.UnitTests/NavigationUnitTest.cs @@ -203,7 +203,7 @@ namespace Xamarin.Forms.Core.UnitTests await nav.PushAsync (child1); await nav.PushAsync (child2); - var copy = nav.StackCopy; + var copy = ((INavigationPageController)nav).StackCopy; Assert.AreEqual (child2, copy.Pop ()); Assert.AreEqual (child1, copy.Pop ()); @@ -217,7 +217,7 @@ namespace Xamarin.Forms.Core.UnitTests var nav = new NavigationPage (root); Assert.AreEqual (root, nav.LogicalChildren[0]); - Assert.AreEqual (1, nav.StackDepth); + Assert.AreEqual (1, ((INavigationPageController)nav).StackDepth); } [Test] diff --git a/Xamarin.Forms.Core/INavigationPageController.cs b/Xamarin.Forms.Core/INavigationPageController.cs new file mode 100644 index 00000000..eddbe750 --- /dev/null +++ b/Xamarin.Forms.Core/INavigationPageController.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Xamarin.Forms.Internals; + +namespace Xamarin.Forms +{ + public interface INavigationPageController + { + Stack StackCopy { get; } + + int StackDepth { get; } + + Task PopAsyncInner(bool animated, bool fast = false); + + event EventHandler InsertPageBeforeRequested; + + event EventHandler PopRequested; + + event EventHandler PopToRootRequested; + + event EventHandler PushRequested; + + event EventHandler RemovePageRequested; + } +} \ No newline at end of file diff --git a/Xamarin.Forms.Core/Internals/NavigationRequestedEventArgs.cs b/Xamarin.Forms.Core/Internals/NavigationRequestedEventArgs.cs new file mode 100644 index 00000000..32022f14 --- /dev/null +++ b/Xamarin.Forms.Core/Internals/NavigationRequestedEventArgs.cs @@ -0,0 +1,26 @@ +using System.Threading.Tasks; + +namespace Xamarin.Forms.Internals +{ + public class NavigationRequestedEventArgs : NavigationEventArgs + { + public NavigationRequestedEventArgs(Page page, bool animated, bool realize = true) : base(page) + { + Animated = animated; + Realize = realize; + } + + public NavigationRequestedEventArgs(Page page, Page before, bool animated) : this(page, animated) + { + BeforePage = before; + } + + public bool Animated { get; set; } + + public Page BeforePage { get; set; } + + public bool Realize { get; set; } + + public Task Task { get; set; } + } +} \ No newline at end of file diff --git a/Xamarin.Forms.Core/NavigationPage.cs b/Xamarin.Forms.Core/NavigationPage.cs index 61545b11..b13fc6c4 100644 --- a/Xamarin.Forms.Core/NavigationPage.cs +++ b/Xamarin.Forms.Core/NavigationPage.cs @@ -2,12 +2,13 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Xamarin.Forms.Internals; using Xamarin.Forms.Platform; namespace Xamarin.Forms { [RenderWith(typeof(_NavigationPageRenderer))] - public class NavigationPage : Page, IPageContainer + public class NavigationPage : Page, IPageContainer, INavigationPageController { public static readonly BindableProperty BackButtonTitleProperty = BindableProperty.CreateAttached("BackButtonTitle", typeof(string), typeof(Page), null); @@ -58,7 +59,7 @@ namespace Xamarin.Forms internal Task CurrentNavigationTask { get; set; } - internal Stack StackCopy + Stack INavigationPageController.StackCopy { get { @@ -69,7 +70,7 @@ namespace Xamarin.Forms } } - internal int StackDepth + int INavigationPageController.StackDepth { get { return InternalChildren.Count; } } @@ -116,12 +117,12 @@ namespace Xamarin.Forms CurrentNavigationTask = tcs.Task; await oldTask; - Page page = await PopAsyncInner(animated); + Page page = await ((INavigationPageController)this).PopAsyncInner(animated); tcs.SetResult(true); return page; } - Task result = PopAsyncInner(animated); + Task result = ((INavigationPageController)this).PopAsyncInner(animated); CurrentNavigationTask = result; return await result; } @@ -206,7 +207,7 @@ namespace Xamarin.Forms if (CurrentPage.SendBackButtonPressed()) return true; - if (StackDepth > 1) + if (((INavigationPageController)this).StackDepth > 1) { SafePop(); return true; @@ -215,11 +216,17 @@ namespace Xamarin.Forms return base.OnBackButtonPressed(); } - internal event EventHandler InsertPageBeforeRequested; + event EventHandler InsertPageBeforeRequestedInternal; - internal async Task PopAsyncInner(bool animated, bool fast = false) + event EventHandler INavigationPageController.InsertPageBeforeRequested { - if (StackDepth == 1) + add { InsertPageBeforeRequestedInternal += value; } + remove { InsertPageBeforeRequestedInternal -= value; } + } + + async Task INavigationPageController.PopAsyncInner(bool animated, bool fast) + { + if (((INavigationPageController)this).StackDepth == 1) { return null; } @@ -230,7 +237,7 @@ namespace Xamarin.Forms var removed = true; - EventHandler requestPop = PopRequested; + EventHandler requestPop = PopRequestedInternal; if (requestPop != null) { requestPop(this, args); @@ -252,13 +259,37 @@ namespace Xamarin.Forms return page; } - internal event EventHandler PopRequested; + event EventHandler PopRequestedInternal; + + event EventHandler INavigationPageController.PopRequested + { + add { PopRequestedInternal += value; } + remove { PopRequestedInternal -= value; } + } - internal event EventHandler PopToRootRequested; + event EventHandler PopToRootRequestedInternal; - internal event EventHandler PushRequested; + event EventHandler INavigationPageController.PopToRootRequested + { + add { PopToRootRequestedInternal += value; } + remove { PopToRootRequestedInternal -= value; } + } - internal event EventHandler RemovePageRequested; + event EventHandler PushRequestedInternal; + + event EventHandler INavigationPageController.PushRequested + { + add { PushRequestedInternal += value; } + remove { PushRequestedInternal -= value; } + } + + event EventHandler RemovePageRequestedInternal; + + event EventHandler INavigationPageController.RemovePageRequested + { + add { RemovePageRequestedInternal += value; } + remove { RemovePageRequestedInternal -= value; } + } void InsertPageBefore(Page page, Page before) { @@ -268,7 +299,7 @@ namespace Xamarin.Forms if (InternalChildren.Contains(page)) throw new ArgumentException("Cannot insert page which is already in the navigation stack"); - EventHandler handler = InsertPageBeforeRequested; + EventHandler handler = InsertPageBeforeRequestedInternal; if (handler != null) handler(this, new NavigationRequestedEventArgs(page, before, false)); @@ -282,7 +313,7 @@ namespace Xamarin.Forms async Task PopToRootAsyncInner(bool animated) { - if (StackDepth == 1) + if (((INavigationPageController)this).StackDepth == 1) return; var root = (Page)InternalChildren.First(); @@ -293,7 +324,7 @@ namespace Xamarin.Forms var args = new NavigationRequestedEventArgs(root, animated); - EventHandler requestPopToRoot = PopToRootRequested; + EventHandler requestPopToRoot = PopToRootRequestedInternal; if (requestPopToRoot != null) { requestPopToRoot(this, args); @@ -315,7 +346,7 @@ namespace Xamarin.Forms var args = new NavigationRequestedEventArgs(page, animated); - EventHandler requestPush = PushRequested; + EventHandler requestPush = PushRequestedInternal; if (requestPush != null) { requestPush(this, args); @@ -337,7 +368,7 @@ namespace Xamarin.Forms void RemovePage(Page page) { - if (page == CurrentPage && StackDepth <= 1) + if (page == CurrentPage && ((INavigationPageController)this).StackDepth <= 1) throw new InvalidOperationException("Cannot remove root page when it is also the currently displayed page."); if (page == CurrentPage) { @@ -349,7 +380,7 @@ namespace Xamarin.Forms if (!InternalChildren.Contains(page)) throw new ArgumentException("Page to remove must be contained on this Navigation Page"); - EventHandler handler = RemovePageRequested; + EventHandler handler = RemovePageRequestedInternal; if (handler != null) handler(this, new NavigationRequestedEventArgs(page, true)); diff --git a/Xamarin.Forms.Core/NavigationRequestedEventArgs.cs b/Xamarin.Forms.Core/NavigationRequestedEventArgs.cs deleted file mode 100644 index b21cffce..00000000 --- a/Xamarin.Forms.Core/NavigationRequestedEventArgs.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Threading.Tasks; - -namespace Xamarin.Forms -{ - internal class NavigationRequestedEventArgs : NavigationEventArgs - { - public NavigationRequestedEventArgs(Page page, bool animated, bool realize = true) : base(page) - { - Animated = animated; - Realize = realize; - } - - public NavigationRequestedEventArgs(Page page, Page before, bool animated) : this(page, animated) - { - BeforePage = before; - } - - public bool Animated { get; set; } - - public Page BeforePage { get; set; } - - public bool Realize { get; set; } - - public Task Task { get; set; } - } -} \ No newline at end of file diff --git a/Xamarin.Forms.Core/Xamarin.Forms.Core.csproj b/Xamarin.Forms.Core/Xamarin.Forms.Core.csproj index 24160a53..e5a1b640 100644 --- a/Xamarin.Forms.Core/Xamarin.Forms.Core.csproj +++ b/Xamarin.Forms.Core/Xamarin.Forms.Core.csproj @@ -94,6 +94,7 @@ + @@ -169,7 +170,7 @@ - + diff --git a/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs index 30733c64..7196cf8c 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs @@ -15,6 +15,7 @@ using Android.Support.V4.Widget; using Android.Support.V7.Graphics.Drawable; using Android.Util; using Android.Views; +using Xamarin.Forms.Internals; using ActionBarDrawerToggle = Android.Support.V7.App.ActionBarDrawerToggle; using AView = Android.Views.View; using AToolbar = Android.Support.V7.Widget.Toolbar; @@ -137,11 +138,14 @@ namespace Xamarin.Forms.Platform.Android.AppCompat IVisualElementRenderer renderer = Android.Platform.GetRenderer(child); renderer?.Dispose(); } - Element.PushRequested -= OnPushed; - Element.PopRequested -= OnPopped; - Element.PopToRootRequested -= OnPoppedToRoot; - Element.InsertPageBeforeRequested -= OnInsertPageBeforeRequested; - Element.RemovePageRequested -= OnRemovePageRequested; + + var navController = (INavigationPageController)Element; + + navController.PushRequested -= OnPushed; + navController.PopRequested -= OnPopped; + navController.PopToRootRequested -= OnPoppedToRoot; + navController.InsertPageBeforeRequested -= OnInsertPageBeforeRequested; + navController.RemovePageRequested -= OnRemovePageRequested; Element.SendDisappearing(); } @@ -188,11 +192,13 @@ namespace Xamarin.Forms.Platform.Android.AppCompat if (e.OldElement != null) { - e.OldElement.PushRequested -= OnPushed; - e.OldElement.PopRequested -= OnPopped; - e.OldElement.PopToRootRequested -= OnPoppedToRoot; - e.OldElement.InsertPageBeforeRequested -= OnInsertPageBeforeRequested; - e.OldElement.RemovePageRequested -= OnRemovePageRequested; + var oldNavController = (INavigationPageController)e.OldElement; + + oldNavController.PushRequested -= OnPushed; + oldNavController.PopRequested -= OnPopped; + oldNavController.PopToRootRequested -= OnPoppedToRoot; + oldNavController.InsertPageBeforeRequested -= OnInsertPageBeforeRequested; + oldNavController.RemovePageRequested -= OnRemovePageRequested; RemoveAllViews(); if (_toolbar != null) @@ -220,14 +226,16 @@ namespace Xamarin.Forms.Platform.Android.AppCompat _toolbarTracker.AdditionalTargets = parents; UpdateMenu(); - e.NewElement.PushRequested += OnPushed; - e.NewElement.PopRequested += OnPopped; - e.NewElement.PopToRootRequested += OnPoppedToRoot; - e.NewElement.InsertPageBeforeRequested += OnInsertPageBeforeRequested; - e.NewElement.RemovePageRequested += OnRemovePageRequested; + var navController = (INavigationPageController)e.NewElement; + + navController.PushRequested += OnPushed; + navController.PopRequested += OnPopped; + navController.PopToRootRequested += OnPoppedToRoot; + navController.InsertPageBeforeRequested += OnInsertPageBeforeRequested; + navController.RemovePageRequested += OnRemovePageRequested; // If there is already stuff on the stack we need to push it - e.NewElement.StackCopy.Reverse().ForEach(p => PushViewAsync(p, false)); + ((INavigationPageController)e.NewElement).StackCopy.Reverse().ForEach(p => PushViewAsync(p, false)); } } @@ -415,7 +423,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat Task OnPopViewAsync(Page page, bool animated) { - Page pageToShow = Element.StackCopy.Skip(1).FirstOrDefault(); + Page pageToShow = ((INavigationPageController)Element).StackCopy.Skip(1).FirstOrDefault(); if (pageToShow == null) return Task.FromResult(false); @@ -593,10 +601,10 @@ namespace Xamarin.Forms.Platform.Android.AppCompat if (!removed) { UpdateToolbar(); - if (_drawerToggle != null && Element.StackDepth == 2) + if (_drawerToggle != null && ((INavigationPageController)Element).StackDepth == 2) AnimateArrowIn(); } - else if (_drawerToggle != null && Element.StackDepth == 2) + else if (_drawerToggle != null && ((INavigationPageController)Element).StackDepth == 2) AnimateArrowOut(); Device.StartTimer(TimeSpan.FromMilliseconds(200), () => @@ -680,7 +688,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat if (bar == null) return; - bool isNavigated = Element.StackDepth > 1; + bool isNavigated = ((INavigationPageController)Element).StackDepth > 1; bar.NavigationIcon = null; if (isNavigated) diff --git a/Xamarin.Forms.Platform.Android/Platform.cs b/Xamarin.Forms.Platform.Android/Platform.cs index 8c289ef4..c00b9544 100644 --- a/Xamarin.Forms.Platform.Android/Platform.cs +++ b/Xamarin.Forms.Platform.Android/Platform.cs @@ -872,7 +872,7 @@ namespace Xamarin.Forms.Platform.Android return false; bool hasMasterDetailPage = CurrentMasterDetailPage != null; - bool navigated = CurrentNavigationPage != null && CurrentNavigationPage.StackDepth > 1; + bool navigated = CurrentNavigationPage != null && ((INavigationPageController)CurrentNavigationPage).StackDepth > 1; bool navigationPageHasNavigationBar = CurrentNavigationPage != null && NavigationPage.GetHasNavigationBar(CurrentNavigationPage.CurrentPage); return navigationPageHasNavigationBar || (hasMasterDetailPage && !navigated); } @@ -880,7 +880,7 @@ namespace Xamarin.Forms.Platform.Android bool ShouldUpdateActionBarUpColor() { bool hasMasterDetailPage = CurrentMasterDetailPage != null; - bool navigated = CurrentNavigationPage != null && CurrentNavigationPage.StackDepth > 1; + bool navigated = CurrentNavigationPage != null && ((INavigationPageController)CurrentNavigationPage).StackDepth > 1; return (hasMasterDetailPage && navigated) || !hasMasterDetailPage; } @@ -903,7 +903,7 @@ namespace Xamarin.Forms.Platform.Android if (CurrentNavigationPage == null) return false; - bool pagePushed = CurrentNavigationPage.StackDepth > 1; + bool pagePushed = ((INavigationPageController)CurrentNavigationPage).StackDepth > 1; bool pushedPageHasBackButton = NavigationPage.GetHasBackButton(CurrentNavigationPage.CurrentPage); return pagePushed && pushedPageHasBackButton; diff --git a/Xamarin.Forms.Platform.Android/Renderers/NavigationRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/NavigationRenderer.cs index 91e052ca..395a0f82 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/NavigationRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/NavigationRenderer.cs @@ -2,6 +2,7 @@ using System; using System.Linq; using System.Threading.Tasks; using Android.Views; +using Xamarin.Forms.Internals; using AButton = Android.Widget.Button; using AView = Android.Views.View; using AndroidAnimation = Android.Animation; @@ -47,11 +48,13 @@ namespace Xamarin.Forms.Platform.Android if (Element != null) { - Element.PushRequested -= OnPushed; - Element.PopRequested -= OnPopped; - Element.PopToRootRequested -= OnPoppedToRoot; - Element.InsertPageBeforeRequested -= OnInsertPageBeforeRequested; - Element.RemovePageRequested -= OnRemovePageRequested; + var navController = (INavigationPageController)Element; + + navController.PushRequested -= OnPushed; + navController.PopRequested -= OnPopped; + navController.PopToRootRequested -= OnPoppedToRoot; + navController.InsertPageBeforeRequested -= OnInsertPageBeforeRequested; + navController.RemovePageRequested -= OnRemovePageRequested; } } @@ -76,25 +79,27 @@ namespace Xamarin.Forms.Platform.Android if (e.OldElement != null) { - NavigationPage oldNav = e.OldElement; - oldNav.PushRequested -= OnPushed; - oldNav.PopRequested -= OnPopped; - oldNav.PopToRootRequested -= OnPoppedToRoot; - oldNav.InsertPageBeforeRequested -= OnInsertPageBeforeRequested; - oldNav.RemovePageRequested -= OnRemovePageRequested; + var oldNavController = (INavigationPageController)e.OldElement; + + oldNavController.PushRequested -= OnPushed; + oldNavController.PopRequested -= OnPopped; + oldNavController.PopToRootRequested -= OnPoppedToRoot; + oldNavController.InsertPageBeforeRequested -= OnInsertPageBeforeRequested; + oldNavController.RemovePageRequested -= OnRemovePageRequested; RemoveAllViews(); } - NavigationPage nav = e.NewElement; - nav.PushRequested += OnPushed; - nav.PopRequested += OnPopped; - nav.PopToRootRequested += OnPoppedToRoot; - nav.InsertPageBeforeRequested += OnInsertPageBeforeRequested; - nav.RemovePageRequested += OnRemovePageRequested; + var newNavController = (INavigationPageController)e.NewElement; + + newNavController.PushRequested += OnPushed; + newNavController.PopRequested += OnPopped; + newNavController.PopToRootRequested += OnPoppedToRoot; + newNavController.InsertPageBeforeRequested += OnInsertPageBeforeRequested; + newNavController.RemovePageRequested += OnRemovePageRequested; // If there is already stuff on the stack we need to push it - nav.StackCopy.Reverse().ForEach(p => PushViewAsync(p, false)); + newNavController.StackCopy.Reverse().ForEach(p => PushViewAsync(p, false)); } protected override void OnLayout(bool changed, int l, int t, int r, int b) @@ -112,7 +117,7 @@ namespace Xamarin.Forms.Platform.Android protected virtual Task OnPopViewAsync(Page page, bool animated) { - Page pageToShow = Element.StackCopy.Skip(1).FirstOrDefault(); + Page pageToShow = ((INavigationPageController)Element).StackCopy.Skip(1).FirstOrDefault(); if (pageToShow == null) return Task.FromResult(false); diff --git a/Xamarin.Forms.Platform.WP8/NavigationPageRenderer.cs b/Xamarin.Forms.Platform.WP8/NavigationPageRenderer.cs index 35a77f21..2bd5b7b3 100644 --- a/Xamarin.Forms.Platform.WP8/NavigationPageRenderer.cs +++ b/Xamarin.Forms.Platform.WP8/NavigationPageRenderer.cs @@ -5,6 +5,7 @@ using System.Diagnostics; using System.Linq; using System.Windows; using System.Windows.Controls; +using Xamarin.Forms.Internals; namespace Xamarin.Forms.Platform.WinPhone { @@ -26,11 +27,13 @@ namespace Xamarin.Forms.Platform.WinPhone Action init = () => { - Element.PushRequested += PageOnPushed; - Element.PopRequested += PageOnPopped; - Element.PopToRootRequested += PageOnPoppedToRoot; - Element.RemovePageRequested += RemovePageRequested; - Element.InsertPageBeforeRequested += ElementOnInsertPageBeforeRequested; + var navController = (INavigationPageController)Element; + + navController.PushRequested += PageOnPushed; + navController.PopRequested += PageOnPopped; + navController.PopToRootRequested += PageOnPoppedToRoot; + navController.RemovePageRequested += RemovePageRequested; + navController.InsertPageBeforeRequested += ElementOnInsertPageBeforeRequested; Element.PropertyChanged += OnElementPropertyChanged; var platform = (Platform)Element.Platform; @@ -132,7 +135,7 @@ namespace Xamarin.Forms.Platform.WinPhone var platform = Element.Platform as Platform; if (platform != null) { - if (e.Page == Element.StackCopy.LastOrDefault()) + if (e.Page == ((INavigationPageController)Element).StackCopy.LastOrDefault()) e.Page.IgnoresContainerArea = true; e.Task = platform.PushCore(e.Page, Element, e.Animated, e.Realize).ContinueWith((t, o) => true, null); } diff --git a/Xamarin.Forms.Platform.WinRT/NavigationPageRenderer.cs b/Xamarin.Forms.Platform.WinRT/NavigationPageRenderer.cs index 8bcf207f..9fe59bad 100644 --- a/Xamarin.Forms.Platform.WinRT/NavigationPageRenderer.cs +++ b/Xamarin.Forms.Platform.WinRT/NavigationPageRenderer.cs @@ -12,6 +12,7 @@ using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Media.Animation; +using Xamarin.Forms.Internals; #if WINDOWS_UWP using Windows.UI.Xaml.Data; using Windows.UI.Core; @@ -154,8 +155,8 @@ namespace Xamarin.Forms.Platform.WinRT if (oldElement != null) { - oldElement.PushRequested -= OnPushRequested; - oldElement.PopRequested -= OnPopRequested; + ((INavigationPageController)oldElement).PushRequested -= OnPushRequested; + ((INavigationPageController)oldElement).PopRequested -= OnPopRequested; oldElement.InternalChildren.CollectionChanged -= OnChildrenChanged; oldElement.PropertyChanged -= OnElementPropertyChanged; } @@ -184,8 +185,8 @@ namespace Xamarin.Forms.Platform.WinRT UpdateTitleColor(); UpdateNavigationBarBackground(); Element.PropertyChanged += OnElementPropertyChanged; - Element.PushRequested += OnPushRequested; - Element.PopRequested += OnPopRequested; + ((INavigationPageController)Element).PushRequested += OnPushRequested; + ((INavigationPageController)Element).PopRequested += OnPopRequested; Element.InternalChildren.CollectionChanged += OnChildrenChanged; if (!string.IsNullOrEmpty(Element.AutomationId)) @@ -391,8 +392,8 @@ namespace Xamarin.Forms.Platform.WinRT void PushExistingNavigationStack() { - for (int i = Element.StackCopy.Count - 1; i >= 0; i--) - SetPage(Element.StackCopy.ElementAt(i), false, false); + for (int i = ((INavigationPageController)Element).StackCopy.Count - 1; i >= 0; i--) + SetPage(((INavigationPageController)Element).StackCopy.ElementAt(i), false, false); } void SetPage(Page page, bool isAnimated, bool isPopping) diff --git a/Xamarin.Forms.Platform.iOS/Renderers/NavigationRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/NavigationRenderer.cs index da3a0aa2..5fb69c0d 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/NavigationRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/NavigationRenderer.cs @@ -6,6 +6,7 @@ using System.Drawing; using System.Linq; using System.Threading; using System.Threading.Tasks; +using Xamarin.Forms.Internals; #if __UNIFIED__ using UIKit; using CoreGraphics; @@ -217,18 +218,20 @@ namespace Xamarin.Forms.Platform.iOS "NavigationPage must have a root Page before being used. Either call PushAsync with a valid Page, or pass a Page to the constructor before usage."); } - navPage.PushRequested += OnPushRequested; - navPage.PopRequested += OnPopRequested; - navPage.PopToRootRequested += OnPopToRootRequested; - navPage.RemovePageRequested += OnRemovedPageRequested; - navPage.InsertPageBeforeRequested += OnInsertPageBeforeRequested; + var navController = ((INavigationPageController)navPage); + + navController.PushRequested += OnPushRequested; + navController.PopRequested += OnPopRequested; + navController.PopToRootRequested += OnPopToRootRequested; + navController.RemovePageRequested += OnRemovedPageRequested; + navController.InsertPageBeforeRequested += OnInsertPageBeforeRequested; UpdateTint(); UpdateBarBackgroundColor(); UpdateBarTextColor(); // If there is already stuff on the stack we need to push it - navPage.StackCopy.Reverse().ForEach(async p => await PushPageAsync(p, false)); + ((INavigationPageController)navPage).StackCopy.Reverse().ForEach(async p => await PushPageAsync(p, false)); _tracker = new VisualElementTracker(this); @@ -260,11 +263,13 @@ namespace Xamarin.Forms.Platform.iOS var navPage = (NavigationPage)Element; navPage.PropertyChanged -= HandlePropertyChanged; - navPage.PushRequested -= OnPushRequested; - navPage.PopRequested -= OnPopRequested; - navPage.PopToRootRequested -= OnPopToRootRequested; - navPage.RemovePageRequested -= OnRemovedPageRequested; - navPage.InsertPageBeforeRequested -= OnInsertPageBeforeRequested; + + var navController = ((INavigationPageController)navPage); + navController.PushRequested -= OnPushRequested; + navController.PopRequested -= OnPopRequested; + navController.PopToRootRequested -= OnPopToRootRequested; + navController.RemovePageRequested -= OnRemovedPageRequested; + navController.InsertPageBeforeRequested -= OnInsertPageBeforeRequested; } base.Dispose(disposing); @@ -542,7 +547,7 @@ namespace Xamarin.Forms.Platform.iOS for (var i = 0; i < removed; i++) { // lets just pop these suckers off, do not await, the true is there to make this fast - await ((NavigationPage)Element).PopAsyncInner(animated, true); + await ((INavigationPageController)Element).PopAsyncInner(animated, true); } // because we skip the normal pop process we need to dispose ourselves controller.Dispose(); @@ -625,7 +630,7 @@ namespace Xamarin.Forms.Platform.iOS void UpdateLeftBarButtonItem(ParentingViewController containerController) { var currentChild = containerController.Child; - var firstPage = ((NavigationPage)Element).StackCopy.LastOrDefault(); + var firstPage = ((INavigationPageController)Element).StackCopy.LastOrDefault(); if ((currentChild != firstPage && NavigationPage.GetHasBackButton(currentChild)) || _parentMasterDetailPage == null) return; diff --git a/docs/Xamarin.Forms.Core/Xamarin.Forms.Internals/NavigationRequestedEventArgs.xml b/docs/Xamarin.Forms.Core/Xamarin.Forms.Internals/NavigationRequestedEventArgs.xml new file mode 100644 index 00000000..72f27d4b --- /dev/null +++ b/docs/Xamarin.Forms.Core/Xamarin.Forms.Internals/NavigationRequestedEventArgs.xml @@ -0,0 +1,122 @@ + + + + + Xamarin.Forms.Core + 2.0.0.0 + + + Xamarin.Forms.NavigationEventArgs + + + + To be added. + To be added. + + + + + + Constructor + + 2.0.0.0 + + + + + + + + To be added. + To be added. + To be added. + To be added. + To be added. + + + + + + Constructor + + 2.0.0.0 + + + + + + + + To be added. + To be added. + To be added. + To be added. + To be added. + + + + + + Property + + 2.0.0.0 + + + System.Boolean + + + To be added. + To be added. + To be added. + + + + + + Property + + 2.0.0.0 + + + Xamarin.Forms.Page + + + To be added. + To be added. + To be added. + + + + + + Property + + 2.0.0.0 + + + System.Boolean + + + To be added. + To be added. + To be added. + + + + + + Property + + 2.0.0.0 + + + System.Threading.Tasks.Task<System.Boolean> + + + To be added. + To be added. + To be added. + + + + diff --git a/docs/Xamarin.Forms.Core/Xamarin.Forms/INavigationPageController.xml b/docs/Xamarin.Forms.Core/Xamarin.Forms/INavigationPageController.xml new file mode 100644 index 00000000..f776f98c --- /dev/null +++ b/docs/Xamarin.Forms.Core/Xamarin.Forms/INavigationPageController.xml @@ -0,0 +1,144 @@ + + + + + Xamarin.Forms.Core + 2.0.0.0 + + + + To be added. + To be added. + + + + + + Event + + 2.0.0.0 + + + System.EventHandler<Xamarin.Forms.NavigationRequestedEventArgs> + + + To be added. + To be added. + + + + + + Method + + 2.0.0.0 + + + System.Threading.Tasks.Task<Xamarin.Forms.Page> + + + + + + + To be added. + To be added. + To be added. + To be added. + To be added. + + + + + + Event + + 2.0.0.0 + + + System.EventHandler<Xamarin.Forms.NavigationRequestedEventArgs> + + + To be added. + To be added. + + + + + + Event + + 2.0.0.0 + + + System.EventHandler<Xamarin.Forms.NavigationRequestedEventArgs> + + + To be added. + To be added. + + + + + + Event + + 2.0.0.0 + + + System.EventHandler<Xamarin.Forms.NavigationRequestedEventArgs> + + + To be added. + To be added. + + + + + + Event + + 2.0.0.0 + + + System.EventHandler<Xamarin.Forms.NavigationRequestedEventArgs> + + + To be added. + To be added. + + + + + + Property + + 2.0.0.0 + + + System.Collections.Generic.Stack<Xamarin.Forms.Page> + + + To be added. + To be added. + To be added. + + + + + + Property + + 2.0.0.0 + + + System.Int32 + + + To be added. + To be added. + To be added. + + + + diff --git a/docs/Xamarin.Forms.Core/Xamarin.Forms/NavigationPage.xml b/docs/Xamarin.Forms.Core/Xamarin.Forms/NavigationPage.xml index 1004ed1e..f58b6d8f 100644 --- a/docs/Xamarin.Forms.Core/Xamarin.Forms/NavigationPage.xml +++ b/docs/Xamarin.Forms.Core/Xamarin.Forms/NavigationPage.xml @@ -1,6 +1,6 @@ - - + + Xamarin.Forms.Core 1.0.0.0 @@ -15,6 +15,9 @@ Xamarin.Forms.Page + + Xamarin.Forms.INavigationPageController + Xamarin.Forms.IPageContainer<Xamarin.Forms.Page> @@ -419,7 +422,7 @@ System.Diagnostics.DebuggerStepThrough - System.Runtime.CompilerServices.AsyncStateMachine(typeof(Xamarin.Forms.NavigationPage/<PopAsync>d__68)) + System.Runtime.CompilerServices.AsyncStateMachine(typeof(Xamarin.Forms.NavigationPage/<PopAsync>d__36)) @@ -515,7 +518,7 @@ System.Diagnostics.DebuggerStepThrough - System.Runtime.CompilerServices.AsyncStateMachine(typeof(Xamarin.Forms.NavigationPage/<PopToRootAsync>d__71)) + System.Runtime.CompilerServices.AsyncStateMachine(typeof(Xamarin.Forms.NavigationPage/<PopToRootAsync>d__44)) @@ -572,7 +575,7 @@ System.Diagnostics.DebuggerStepThrough - System.Runtime.CompilerServices.AsyncStateMachine(typeof(Xamarin.Forms.NavigationPage/<PushAsync>d__65)) + System.Runtime.CompilerServices.AsyncStateMachine(typeof(Xamarin.Forms.NavigationPage/<PushAsync>d__46)) @@ -811,5 +814,67 @@ public class MyPage : NavigationPage To be added. + + + + Method + + 2.0.0.0 + + + + System.Diagnostics.DebuggerStepThrough + + + System.Runtime.CompilerServices.AsyncStateMachine(typeof(Xamarin.Forms.NavigationPage/<Xamarin-Forms-INavigationPageController-PopAsyncInner>d__61)) + + + + System.Threading.Tasks.Task<Xamarin.Forms.Page> + + + + + + + To be added. + To be added. + To be added. + To be added. + To be added. + + + + + + Property + + 2.0.0.0 + + + System.Collections.Generic.Stack<Xamarin.Forms.Page> + + + To be added. + To be added. + To be added. + + + + + + Property + + 2.0.0.0 + + + System.Int32 + + + To be added. + To be added. + To be added. + + diff --git a/docs/Xamarin.Forms.Core/Xamarin.Forms/NavigationRequestedEventArgs.xml b/docs/Xamarin.Forms.Core/Xamarin.Forms/NavigationRequestedEventArgs.xml new file mode 100644 index 00000000..550f755d --- /dev/null +++ b/docs/Xamarin.Forms.Core/Xamarin.Forms/NavigationRequestedEventArgs.xml @@ -0,0 +1,122 @@ + + + + + Xamarin.Forms.Core + 2.0.0.0 + + + Xamarin.Forms.NavigationEventArgs + + + + To be added. + To be added. + + + + + + Constructor + + 2.0.0.0 + + + + + + + + To be added. + To be added. + To be added. + To be added. + To be added. + + + + + + Constructor + + 2.0.0.0 + + + + + + + + To be added. + To be added. + To be added. + To be added. + To be added. + + + + + + Property + + 2.0.0.0 + + + System.Boolean + + + To be added. + To be added. + To be added. + + + + + + Property + + 2.0.0.0 + + + Xamarin.Forms.Page + + + To be added. + To be added. + To be added. + + + + + + Property + + 2.0.0.0 + + + System.Boolean + + + To be added. + To be added. + To be added. + + + + + + Property + + 2.0.0.0 + + + System.Threading.Tasks.Task<System.Boolean> + + + To be added. + To be added. + To be added. + + + + -- cgit v1.2.3