summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Core
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Core')
-rw-r--r--Xamarin.Forms.Core/INavigationPageController.cs26
-rw-r--r--Xamarin.Forms.Core/Internals/NavigationRequestedEventArgs.cs (renamed from Xamarin.Forms.Core/NavigationRequestedEventArgs.cs)4
-rw-r--r--Xamarin.Forms.Core/NavigationPage.cs71
-rw-r--r--Xamarin.Forms.Core/Xamarin.Forms.Core.csproj3
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" />