diff options
Diffstat (limited to 'Xamarin.Forms.Core')
-rw-r--r-- | Xamarin.Forms.Core/INavigationPageController.cs | 26 | ||||
-rw-r--r-- | Xamarin.Forms.Core/Internals/NavigationRequestedEventArgs.cs (renamed from Xamarin.Forms.Core/NavigationRequestedEventArgs.cs) | 4 | ||||
-rw-r--r-- | Xamarin.Forms.Core/NavigationPage.cs | 71 | ||||
-rw-r--r-- | Xamarin.Forms.Core/Xamarin.Forms.Core.csproj | 3 |
4 files changed, 81 insertions, 23 deletions
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<Page> StackCopy { get; } + + int StackDepth { get; } + + Task<Page> PopAsyncInner(bool animated, bool fast = false); + + event EventHandler<NavigationRequestedEventArgs> InsertPageBeforeRequested; + + event EventHandler<NavigationRequestedEventArgs> PopRequested; + + event EventHandler<NavigationRequestedEventArgs> PopToRootRequested; + + event EventHandler<NavigationRequestedEventArgs> PushRequested; + + event EventHandler<NavigationRequestedEventArgs> RemovePageRequested; + } +}
\ No newline at end of file diff --git a/Xamarin.Forms.Core/NavigationRequestedEventArgs.cs b/Xamarin.Forms.Core/Internals/NavigationRequestedEventArgs.cs index b21cffce..32022f14 100644 --- a/Xamarin.Forms.Core/NavigationRequestedEventArgs.cs +++ b/Xamarin.Forms.Core/Internals/NavigationRequestedEventArgs.cs @@ -1,8 +1,8 @@ using System.Threading.Tasks; -namespace Xamarin.Forms +namespace Xamarin.Forms.Internals { - internal class NavigationRequestedEventArgs : NavigationEventArgs + public class NavigationRequestedEventArgs : NavigationEventArgs { public NavigationRequestedEventArgs(Page page, bool animated, bool realize = true) : base(page) { 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<Page> + public class NavigationPage : Page, IPageContainer<Page>, 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<Page> StackCopy + Stack<Page> 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<Page> result = PopAsyncInner(animated); + Task<Page> 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<NavigationRequestedEventArgs> InsertPageBeforeRequested; + event EventHandler<NavigationRequestedEventArgs> InsertPageBeforeRequestedInternal; - internal async Task<Page> PopAsyncInner(bool animated, bool fast = false) + event EventHandler<NavigationRequestedEventArgs> INavigationPageController.InsertPageBeforeRequested { - if (StackDepth == 1) + add { InsertPageBeforeRequestedInternal += value; } + remove { InsertPageBeforeRequestedInternal -= value; } + } + + async Task<Page> INavigationPageController.PopAsyncInner(bool animated, bool fast) + { + if (((INavigationPageController)this).StackDepth == 1) { return null; } @@ -230,7 +237,7 @@ namespace Xamarin.Forms var removed = true; - EventHandler<NavigationRequestedEventArgs> requestPop = PopRequested; + EventHandler<NavigationRequestedEventArgs> requestPop = PopRequestedInternal; if (requestPop != null) { requestPop(this, args); @@ -252,13 +259,37 @@ namespace Xamarin.Forms return page; } - internal event EventHandler<NavigationRequestedEventArgs> PopRequested; + event EventHandler<NavigationRequestedEventArgs> PopRequestedInternal; + + event EventHandler<NavigationRequestedEventArgs> INavigationPageController.PopRequested + { + add { PopRequestedInternal += value; } + remove { PopRequestedInternal -= value; } + } - internal event EventHandler<NavigationRequestedEventArgs> PopToRootRequested; + event EventHandler<NavigationRequestedEventArgs> PopToRootRequestedInternal; - internal event EventHandler<NavigationRequestedEventArgs> PushRequested; + event EventHandler<NavigationRequestedEventArgs> INavigationPageController.PopToRootRequested + { + add { PopToRootRequestedInternal += value; } + remove { PopToRootRequestedInternal -= value; } + } - internal event EventHandler<NavigationRequestedEventArgs> RemovePageRequested; + event EventHandler<NavigationRequestedEventArgs> PushRequestedInternal; + + event EventHandler<NavigationRequestedEventArgs> INavigationPageController.PushRequested + { + add { PushRequestedInternal += value; } + remove { PushRequestedInternal -= value; } + } + + event EventHandler<NavigationRequestedEventArgs> RemovePageRequestedInternal; + + event EventHandler<NavigationRequestedEventArgs> 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<NavigationRequestedEventArgs> handler = InsertPageBeforeRequested; + EventHandler<NavigationRequestedEventArgs> 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<NavigationRequestedEventArgs> requestPopToRoot = PopToRootRequested; + EventHandler<NavigationRequestedEventArgs> requestPopToRoot = PopToRootRequestedInternal; if (requestPopToRoot != null) { requestPopToRoot(this, args); @@ -315,7 +346,7 @@ namespace Xamarin.Forms var args = new NavigationRequestedEventArgs(page, animated); - EventHandler<NavigationRequestedEventArgs> requestPush = PushRequested; + EventHandler<NavigationRequestedEventArgs> 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<NavigationRequestedEventArgs> handler = RemovePageRequested; + EventHandler<NavigationRequestedEventArgs> handler = RemovePageRequestedInternal; if (handler != null) handler(this, new NavigationRequestedEventArgs(page, true)); 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 @@ <Compile Include="EmailKeyboard.cs" /> <Compile Include="IEntryController.cs" /> <Compile Include="IImageController.cs" /> + <Compile Include="INavigationPageController.cs" /> <Compile Include="Internals\EvalRequested.cs" /> <Compile Include="ExportEffectAttribute.cs" /> <Compile Include="ExpressionSearch.cs" /> @@ -169,7 +170,7 @@ <Compile Include="ModalPushingEventArgs.cs" /> <Compile Include="NavigationEventArgs.cs" /> <Compile Include="NavigationModel.cs" /> - <Compile Include="NavigationRequestedEventArgs.cs" /> + <Compile Include="Internals\NavigationRequestedEventArgs.cs" /> <Compile Include="NotifyCollectionChangedEventArgsEx.cs" /> <Compile Include="NotifyCollectionChangedEventArgsExtensions.cs" /> <Compile Include="NullEffect.cs" /> |