summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorE.Z. Hart <hartez@users.noreply.github.com>2016-05-04 08:22:34 -0600
committerRui Marinho <me@ruimarinho.net>2016-05-04 15:22:34 +0100
commita8acdcc11793c9f44098f2cd478d51677d742945 (patch)
tree811cf1ee2e2ff0baa8674f116b6b5c08590f56cf
parent8d383746caab00dd3ee0b62dc992a2a99c7a6d06 (diff)
downloadxamarin-forms-a8acdcc11793c9f44098f2cd478d51677d742945.tar.gz
xamarin-forms-a8acdcc11793c9f44098f2cd478d51677d742945.tar.bz2
xamarin-forms-a8acdcc11793c9f44098f2cd478d51677d742945.zip
Add IMasterDetailPageController and update renderers (#146)
-rw-r--r--Xamarin.Forms.Core.UnitTests/MasterDetailFormUnitTests.cs20
-rw-r--r--Xamarin.Forms.Core/IMasterDetailPageController.cs19
-rw-r--r--Xamarin.Forms.Core/MasterDetailPage.cs32
-rw-r--r--Xamarin.Forms.Core/Xamarin.Forms.Core.csproj1
-rw-r--r--Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs18
-rw-r--r--Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs2
-rw-r--r--Xamarin.Forms.Platform.Android/Platform.cs6
-rw-r--r--Xamarin.Forms.Platform.Android/Renderers/MasterDetailContainer.cs10
-rw-r--r--Xamarin.Forms.Platform.Android/Renderers/MasterDetailRenderer.cs19
-rw-r--r--Xamarin.Forms.Platform.UAP/MasterDetailPageRenderer.cs8
-rw-r--r--Xamarin.Forms.Platform.WP8/MasterDetailRenderer.cs10
-rw-r--r--Xamarin.Forms.Platform.WinRT/MasterDetailPageRenderer.cs8
-rw-r--r--Xamarin.Forms.Platform.iOS/Renderers/PhoneMasterDetailRenderer.cs8
-rw-r--r--Xamarin.Forms.Platform.iOS/Renderers/TabletMasterDetailRenderer.cs19
-rw-r--r--docs/Xamarin.Forms.Core/Xamarin.Forms/IMasterDetailPageController.xml110
-rw-r--r--docs/Xamarin.Forms.Core/Xamarin.Forms/MasterDetailPage.xml90
16 files changed, 312 insertions, 68 deletions
diff --git a/Xamarin.Forms.Core.UnitTests/MasterDetailFormUnitTests.cs b/Xamarin.Forms.Core.UnitTests/MasterDetailFormUnitTests.cs
index 3c1e27ad..8ace2e77 100644
--- a/Xamarin.Forms.Core.UnitTests/MasterDetailFormUnitTests.cs
+++ b/Xamarin.Forms.Core.UnitTests/MasterDetailFormUnitTests.cs
@@ -188,9 +188,9 @@ namespace Xamarin.Forms.Core.UnitTests
Detail = new ContentPage {Content = new View ()}
};
- page.MasterBounds = new Rectangle (0, 0, 100, 100);
+ ((IMasterDetailPageController)page).MasterBounds = new Rectangle (0, 0, 100, 100);
Assert.AreEqual (new Rectangle (0, 0, 100, 100), page.Master.Bounds);
- Assert.AreEqual (new Rectangle (0, 0, 100, 100), page.MasterBounds);
+ Assert.AreEqual (new Rectangle (0, 0, 100, 100), ((IMasterDetailPageController)page).MasterBounds);
}
[Test]
@@ -201,9 +201,9 @@ namespace Xamarin.Forms.Core.UnitTests
Detail = new ContentPage {Content = new View ()}
};
- page.DetailBounds = new Rectangle (0, 0, 100, 100);
+ ((IMasterDetailPageController)page).DetailBounds = new Rectangle (0, 0, 100, 100);
Assert.AreEqual (new Rectangle (0, 0, 100, 100), page.Detail.Bounds);
- Assert.AreEqual (new Rectangle (0, 0, 100, 100), page.DetailBounds);
+ Assert.AreEqual (new Rectangle (0, 0, 100, 100), ((IMasterDetailPageController)page).DetailBounds);
}
[Test]
@@ -216,8 +216,8 @@ namespace Xamarin.Forms.Core.UnitTests
Platform = new UnitPlatform ()
};
- page.MasterBounds = new Rectangle (0, 0, 100, 200);
- page.DetailBounds = new Rectangle (0, 0, 100, 100);
+ ((IMasterDetailPageController)page).MasterBounds = new Rectangle (0, 0, 100, 200);
+ ((IMasterDetailPageController)page).DetailBounds = new Rectangle (0, 0, 100, 100);
page.Master.Layout (new Rectangle(0, 0, 1, 1));
page.Detail.Layout (new Rectangle(0, 0, 1, 1));
@@ -261,7 +261,7 @@ namespace Xamarin.Forms.Core.UnitTests
Platform = new UnitPlatform ()
};
- Assert.Throws<InvalidOperationException> (() => page.DetailBounds = new Rectangle(0, 0, 200, 200));
+ Assert.Throws<InvalidOperationException> (() => ((IMasterDetailPageController)page).DetailBounds = new Rectangle(0, 0, 200, 200));
}
[Test]
@@ -273,7 +273,7 @@ namespace Xamarin.Forms.Core.UnitTests
Platform = new UnitPlatform ()
};
- Assert.Throws<InvalidOperationException> (() => page.MasterBounds = new Rectangle(0, 0, 200, 200));
+ Assert.Throws<InvalidOperationException> (() => ((IMasterDetailPageController)page).MasterBounds = new Rectangle(0, 0, 200, 200));
}
[Test]
@@ -338,7 +338,7 @@ namespace Xamarin.Forms.Core.UnitTests
Platform = new UnitPlatform ()
};
- mdp.BackButtonPressed += (sender, args) => {
+ ((IMasterDetailPageController)mdp).BackButtonPressed += (sender, args) => {
args.Handled = mdp.IsPresented;
mdp.IsPresented = false;
};
@@ -369,7 +369,7 @@ namespace Xamarin.Forms.Core.UnitTests
Platform = new UnitPlatform ()
};
- mdp.BackButtonPressed += (sender, args) => {
+ ((IMasterDetailPageController)mdp).BackButtonPressed += (sender, args) => {
args.Handled = mdp.IsPresented;
mdp.IsPresented = false;
};
diff --git a/Xamarin.Forms.Core/IMasterDetailPageController.cs b/Xamarin.Forms.Core/IMasterDetailPageController.cs
new file mode 100644
index 00000000..1aa019cb
--- /dev/null
+++ b/Xamarin.Forms.Core/IMasterDetailPageController.cs
@@ -0,0 +1,19 @@
+using System;
+
+namespace Xamarin.Forms
+{
+ public interface IMasterDetailPageController
+ {
+ bool CanChangeIsPresented { get; set; }
+
+ Rectangle DetailBounds { get; set; }
+
+ Rectangle MasterBounds { get; set; }
+
+ bool ShouldShowSplitMode { get; }
+
+ void UpdateMasterBehavior();
+
+ event EventHandler<BackButtonPressedEventArgs> BackButtonPressed;
+ }
+} \ No newline at end of file
diff --git a/Xamarin.Forms.Core/MasterDetailPage.cs b/Xamarin.Forms.Core/MasterDetailPage.cs
index a0849aa4..6885ecef 100644
--- a/Xamarin.Forms.Core/MasterDetailPage.cs
+++ b/Xamarin.Forms.Core/MasterDetailPage.cs
@@ -4,7 +4,7 @@ using Xamarin.Forms.Platform;
namespace Xamarin.Forms
{
[RenderWith(typeof(_MasterDetailPageRenderer))]
- public class MasterDetailPage : Page
+ public class MasterDetailPage : Page, IMasterDetailPageController
{
public static readonly BindableProperty IsGestureEnabledProperty = BindableProperty.Create("IsGestureEnabled", typeof(bool), typeof(MasterDetailPage), true);
@@ -89,9 +89,9 @@ namespace Xamarin.Forms
set { SetValue(MasterBehaviorProperty, value); }
}
- internal bool CanChangeIsPresented { get; set; } = true;
+ bool IMasterDetailPageController.CanChangeIsPresented { get; set; } = true;
- internal Rectangle DetailBounds
+ Rectangle IMasterDetailPageController.DetailBounds
{
get { return _detailBounds; }
set
@@ -103,7 +103,7 @@ namespace Xamarin.Forms
}
}
- internal Rectangle MasterBounds
+ Rectangle IMasterDetailPageController.MasterBounds
{
get { return _masterBounds; }
set
@@ -115,7 +115,7 @@ namespace Xamarin.Forms
}
}
- internal bool ShouldShowSplitMode
+ bool IMasterDetailPageController.ShouldShowSplitMode
{
get
{
@@ -156,7 +156,7 @@ namespace Xamarin.Forms
protected override void OnAppearing()
{
- CanChangeIsPresented = true;
+ ((IMasterDetailPageController)this).CanChangeIsPresented = true;
UpdateMasterBehavior(this);
base.OnAppearing();
}
@@ -169,7 +169,7 @@ namespace Xamarin.Forms
return true;
}
- EventHandler<BackButtonPressedEventArgs> handler = BackButtonPressed;
+ EventHandler<BackButtonPressedEventArgs> handler = BackButtonPressedInternal;
if (handler != null)
{
var args = new BackButtonPressedEventArgs();
@@ -193,15 +193,25 @@ namespace Xamarin.Forms
base.OnParentSet();
}
- internal event EventHandler<BackButtonPressedEventArgs> BackButtonPressed;
+ event EventHandler<BackButtonPressedEventArgs> BackButtonPressedInternal;
+ event EventHandler<BackButtonPressedEventArgs> IMasterDetailPageController.BackButtonPressed
+ {
+ add { BackButtonPressedInternal += value; }
+ remove { BackButtonPressedInternal -= value; }
+ }
+
+ void IMasterDetailPageController.UpdateMasterBehavior()
+ {
+ UpdateMasterBehavior(this);
+ }
internal static void UpdateMasterBehavior(MasterDetailPage page)
{
- if (page.ShouldShowSplitMode)
+ if (((IMasterDetailPageController)page).ShouldShowSplitMode)
{
page.SetValueCore(IsPresentedProperty, true);
if (page.MasterBehavior != MasterBehavior.Default)
- page.CanChangeIsPresented = false;
+ ((IMasterDetailPageController)page).CanChangeIsPresented = false;
}
}
@@ -216,7 +226,7 @@ namespace Xamarin.Forms
static void OnIsPresentedPropertyChanging(BindableObject sender, object oldValue, object newValue)
{
var page = (MasterDetailPage)sender;
- if (!page.CanChangeIsPresented)
+ if (!((IMasterDetailPageController)page).CanChangeIsPresented)
throw new InvalidOperationException(string.Format("Can't change IsPresented when setting {0}", page.MasterBehavior));
}
diff --git a/Xamarin.Forms.Core/Xamarin.Forms.Core.csproj b/Xamarin.Forms.Core/Xamarin.Forms.Core.csproj
index 32cd9b88..1c11517a 100644
--- a/Xamarin.Forms.Core/Xamarin.Forms.Core.csproj
+++ b/Xamarin.Forms.Core/Xamarin.Forms.Core.csproj
@@ -95,6 +95,7 @@
<Compile Include="IEntryController.cs" />
<Compile Include="IImageController.cs" />
<Compile Include="INavigationPageController.cs" />
+ <Compile Include="IMasterDetailPageController.cs" />
<Compile Include="Internals\EvalRequested.cs" />
<Compile Include="ExportEffectAttribute.cs" />
<Compile Include="ExpressionSearch.cs" />
diff --git a/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs
index 3d1e95dc..a180c135 100644
--- a/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs
+++ b/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs
@@ -30,6 +30,8 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
MasterDetailPage Element { get; set; }
+ IMasterDetailPageController MasterDetailPageController => Element as IMasterDetailPageController;
+
bool Presented
{
get { return _presented; }
@@ -39,7 +41,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
return;
UpdateSplitViewLayout();
_presented = value;
- if (Element.MasterBehavior == MasterBehavior.Default && Element.ShouldShowSplitMode)
+ if (Element.MasterBehavior == MasterBehavior.Default && MasterDetailPageController.ShouldShowSplitMode)
return;
if (_presented)
OpenDrawer(_masterLayout);
@@ -87,7 +89,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
if (oldElement != null)
{
- oldElement.BackButtonPressed -= OnBackButtonPressed;
+ ((IMasterDetailPageController)oldElement).BackButtonPressed -= OnBackButtonPressed;
oldElement.PropertyChanged -= HandlePropertyChanged;
oldElement.Appearing -= MasterDetailPageAppearing;
oldElement.Disappearing -= MasterDetailPageDisappearing;
@@ -126,7 +128,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
UpdateMaster();
UpdateDetail();
- newElement.BackButtonPressed += OnBackButtonPressed;
+ ((IMasterDetailPageController)newElement).BackButtonPressed += OnBackButtonPressed;
newElement.PropertyChanged += HandlePropertyChanged;
newElement.Appearing += MasterDetailPageAppearing;
newElement.Disappearing += MasterDetailPageDisappearing;
@@ -182,7 +184,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
if (Element != null)
{
- Element.BackButtonPressed -= OnBackButtonPressed;
+ MasterDetailPageController.BackButtonPressed -= OnBackButtonPressed;
Element.PropertyChanged -= HandlePropertyChanged;
Element.Appearing -= MasterDetailPageAppearing;
Element.Disappearing -= MasterDetailPageDisappearing;
@@ -215,7 +217,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
{
base.OnLayout(changed, l, t, r, b);
//hack to make the split layout handle touches the full width
- if (Element.ShouldShowSplitMode && _masterLayout != null)
+ if (MasterDetailPageController.ShouldShowSplitMode && _masterLayout != null)
_masterLayout.Right = r;
}
@@ -223,9 +225,9 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
{
if (nameof(Device.Info.CurrentOrientation) == e.PropertyName)
{
- if (!Element.ShouldShowSplitMode && Presented)
+ if (!MasterDetailPageController.ShouldShowSplitMode && Presented)
{
- Element.CanChangeIsPresented = true;
+ MasterDetailPageController.CanChangeIsPresented = true;
//hack : when the orientation changes and we try to close the Master on Android
//sometimes Android picks the width of the screen previous to the rotation
//this leaves a little of the master visible, the hack is to delay for 50ms closing the drawer
@@ -343,7 +345,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
{
if (Device.Idiom == TargetIdiom.Tablet)
{
- bool isShowingSplit = Element.ShouldShowSplitMode || (Element.ShouldShowSplitMode && Element.MasterBehavior != MasterBehavior.Default && Element.IsPresented);
+ bool isShowingSplit = MasterDetailPageController.ShouldShowSplitMode || (MasterDetailPageController.ShouldShowSplitMode && Element.MasterBehavior != MasterBehavior.Default && Element.IsPresented);
SetLockMode(isShowingSplit ? LockModeLockedOpen : LockModeUnlocked);
unchecked
{
diff --git a/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs
index 7196cf8c..6a735fe2 100644
--- a/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs
+++ b/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs
@@ -469,7 +469,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
return;
}
- if (masterDetailPage.ShouldShowSplitMode)
+ if (((IMasterDetailPageController)masterDetailPage).ShouldShowSplitMode)
return;
var renderer = Android.Platform.GetRenderer(masterDetailPage) as MasterDetailPageRenderer;
diff --git a/Xamarin.Forms.Platform.Android/Platform.cs b/Xamarin.Forms.Platform.Android/Platform.cs
index c00b9544..a37929fd 100644
--- a/Xamarin.Forms.Platform.Android/Platform.cs
+++ b/Xamarin.Forms.Platform.Android/Platform.cs
@@ -32,6 +32,8 @@ namespace Xamarin.Forms.Platform.Android
internal static readonly BindableProperty PageContextProperty = BindableProperty.CreateAttached("PageContext", typeof(Context), typeof(Platform), null);
+ IMasterDetailPageController MasterDetailPageController => CurrentMasterDetailPage as IMasterDetailPageController;
+
readonly Context _context;
readonly PlatformRenderer _renderer;
@@ -378,7 +380,7 @@ namespace Xamarin.Forms.Platform.Android
}
else if (CurrentMasterDetailPage != null)
{
- if (CurrentMasterDetailPage.ShouldShowSplitMode && CurrentMasterDetailPage.IsPresented)
+ if (MasterDetailPageController.ShouldShowSplitMode && CurrentMasterDetailPage.IsPresented)
return;
CurrentMasterDetailPage.IsPresented = !CurrentMasterDetailPage.IsPresented;
}
@@ -480,7 +482,7 @@ namespace Xamarin.Forms.Platform.Android
return;
}
if (!CurrentMasterDetailPage.ShouldShowToolbarButton() || string.IsNullOrEmpty(CurrentMasterDetailPage.Master.Icon) ||
- (CurrentMasterDetailPage.ShouldShowSplitMode && CurrentMasterDetailPage.IsPresented))
+ (MasterDetailPageController.ShouldShowSplitMode && CurrentMasterDetailPage.IsPresented))
{
//clear out existing icon;
ClearMasterDetailToggle();
diff --git a/Xamarin.Forms.Platform.Android/Renderers/MasterDetailContainer.cs b/Xamarin.Forms.Platform.Android/Renderers/MasterDetailContainer.cs
index 20ef316a..c23eb7c7 100644
--- a/Xamarin.Forms.Platform.Android/Renderers/MasterDetailContainer.cs
+++ b/Xamarin.Forms.Platform.Android/Renderers/MasterDetailContainer.cs
@@ -22,6 +22,8 @@ namespace Xamarin.Forms.Platform.Android
public MasterDetailContainer(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) { }
+ IMasterDetailPageController MasterDetailPageController => _parent as IMasterDetailPageController;
+
public VisualElement ChildView
{
get { return _childView; }
@@ -67,7 +69,7 @@ namespace Xamarin.Forms.Platform.Android
public override bool OnInterceptTouchEvent(MotionEvent ev)
{
- bool isShowingPopover = _parent.IsPresented && !_parent.ShouldShowSplitMode;
+ bool isShowingPopover = _parent.IsPresented && !MasterDetailPageController.ShouldShowSplitMode;
if (!_isMaster && isShowingPopover)
return true;
return base.OnInterceptTouchEvent(ev);
@@ -90,9 +92,9 @@ namespace Xamarin.Forms.Platform.Android
Rectangle bounds = GetBounds(_isMaster, l, t, r, b);
if (_isMaster)
- _parent.MasterBounds = bounds;
+ MasterDetailPageController.MasterBounds = bounds;
else
- _parent.DetailBounds = bounds;
+ MasterDetailPageController.DetailBounds = bounds;
IVisualElementRenderer renderer = Platform.GetRenderer(_childView);
renderer.UpdateLayout();
@@ -113,7 +115,7 @@ namespace Xamarin.Forms.Platform.Android
double xPos = 0;
//splitview
- if (_parent.ShouldShowSplitMode)
+ if (MasterDetailPageController.ShouldShowSplitMode)
{
//to keep some behavior we have on iPad where you can toggle and it won't do anything
bool isDefaultNoToggle = _parent.MasterBehavior == MasterBehavior.Default;
diff --git a/Xamarin.Forms.Platform.Android/Renderers/MasterDetailRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/MasterDetailRenderer.cs
index a9157118..09c0c7c7 100644
--- a/Xamarin.Forms.Platform.Android/Renderers/MasterDetailRenderer.cs
+++ b/Xamarin.Forms.Platform.Android/Renderers/MasterDetailRenderer.cs
@@ -24,6 +24,8 @@ namespace Xamarin.Forms.Platform.Android
{
}
+ IMasterDetailPageController MasterDetailPageController => _page as IMasterDetailPageController;
+
public bool Presented
{
get { return _presented; }
@@ -33,7 +35,7 @@ namespace Xamarin.Forms.Platform.Android
return;
UpdateSplitViewLayout();
_presented = value;
- if (_page.MasterBehavior == MasterBehavior.Default && _page.ShouldShowSplitMode)
+ if (_page.MasterBehavior == MasterBehavior.Default && MasterDetailPageController.ShouldShowSplitMode)
return;
if (_presented)
OpenDrawer(_masterLayout);
@@ -99,10 +101,10 @@ namespace Xamarin.Forms.Platform.Android
OnElementChanged(oldElement, element);
if (oldElement != null)
- oldElement.BackButtonPressed -= OnBackButtonPressed;
+ ((IMasterDetailPageController)oldElement).BackButtonPressed -= OnBackButtonPressed;
if (_page != null)
- _page.BackButtonPressed += OnBackButtonPressed;
+ MasterDetailPageController.BackButtonPressed += OnBackButtonPressed;
if (Tracker == null)
Tracker = new VisualElementTracker(this);
@@ -167,7 +169,7 @@ namespace Xamarin.Forms.Platform.Android
if (_page != null)
{
- _page.BackButtonPressed -= OnBackButtonPressed;
+ MasterDetailPageController.BackButtonPressed -= OnBackButtonPressed;
_page.PropertyChanged -= HandlePropertyChanged;
_page.Appearing -= MasterDetailPageAppearing;
_page.Disappearing -= MasterDetailPageDisappearing;
@@ -202,7 +204,7 @@ namespace Xamarin.Forms.Platform.Android
{
base.OnLayout(changed, l, t, r, b);
//hack to make the split layout handle touches the full width
- if (_page.ShouldShowSplitMode && _masterLayout != null)
+ if (MasterDetailPageController.ShouldShowSplitMode && _masterLayout != null)
_masterLayout.Right = r;
}
@@ -210,9 +212,9 @@ namespace Xamarin.Forms.Platform.Android
{
if (e.PropertyName == "CurrentOrientation")
{
- if (!_page.ShouldShowSplitMode && Presented)
+ if (!MasterDetailPageController.ShouldShowSplitMode && Presented)
{
- _page.CanChangeIsPresented = true;
+ MasterDetailPageController.CanChangeIsPresented = true;
//hack : when the orientation changes and we try to close the Master on Android
//sometimes Android picks the width of the screen previous to the rotation
//this leaves a little of the master visible, the hack is to delay for 50ms closing the drawer
@@ -335,7 +337,8 @@ namespace Xamarin.Forms.Platform.Android
{
if (Device.Idiom == TargetIdiom.Tablet)
{
- bool isShowingSplit = _page.ShouldShowSplitMode || (_page.ShouldShowSplitMode && _page.MasterBehavior != MasterBehavior.Default && _page.IsPresented);
+ bool isShowingSplit = MasterDetailPageController.ShouldShowSplitMode
+ || (MasterDetailPageController.ShouldShowSplitMode && _page.MasterBehavior != MasterBehavior.Default && _page.IsPresented);
SetLockMode(isShowingSplit ? LockModeLockedOpen : LockModeUnlocked);
unchecked
{
diff --git a/Xamarin.Forms.Platform.UAP/MasterDetailPageRenderer.cs b/Xamarin.Forms.Platform.UAP/MasterDetailPageRenderer.cs
index e2ccb312..6f54e804 100644
--- a/Xamarin.Forms.Platform.UAP/MasterDetailPageRenderer.cs
+++ b/Xamarin.Forms.Platform.UAP/MasterDetailPageRenderer.cs
@@ -56,6 +56,8 @@ namespace Xamarin.Forms.Platform.UWP
set { Control.ToolbarForeground = value; }
}
+ IMasterDetailPageController MasterDetailPageController => Element as IMasterDetailPageController;
+
bool ITitleProvider.ShowTitle
{
get { return _showTitle; }
@@ -234,8 +236,8 @@ namespace Xamarin.Forms.Platform.UWP
Windows.Foundation.Size masterSize = Control.MasterSize;
Windows.Foundation.Size detailSize = Control.DetailSize;
- Element.MasterBounds = new Rectangle(0, 0, masterSize.Width, masterSize.Height);
- Element.DetailBounds = new Rectangle(0, 0, detailSize.Width, detailSize.Height);
+ MasterDetailPageController.MasterBounds = new Rectangle(0, 0, masterSize.Width, masterSize.Height);
+ MasterDetailPageController.DetailBounds = new Rectangle(0, 0, detailSize.Width, detailSize.Height);
}
void UpdateDetail()
@@ -290,7 +292,7 @@ namespace Xamarin.Forms.Platform.UWP
void UpdateMode()
{
- Control.ShouldShowSplitMode = Element.ShouldShowSplitMode;
+ Control.ShouldShowSplitMode = MasterDetailPageController.ShouldShowSplitMode;
}
#if WINDOWS_UWP
diff --git a/Xamarin.Forms.Platform.WP8/MasterDetailRenderer.cs b/Xamarin.Forms.Platform.WP8/MasterDetailRenderer.cs
index 43796d92..25ca8465 100644
--- a/Xamarin.Forms.Platform.WP8/MasterDetailRenderer.cs
+++ b/Xamarin.Forms.Platform.WP8/MasterDetailRenderer.cs
@@ -20,6 +20,8 @@ namespace Xamarin.Forms.Platform.WinPhone
AutoPackage = false;
}
+ IMasterDetailPageController MasterDetailPageController => Element as IMasterDetailPageController;
+
public bool Visible { get; private set; }
protected override System.Windows.Size ArrangeOverride(System.Windows.Size finalSize)
@@ -33,10 +35,10 @@ namespace Xamarin.Forms.Platform.WinPhone
base.OnElementChanged(e);
if (e.OldElement != null)
- e.OldElement.BackButtonPressed -= HandleBackButtonPressed;
+ ((IMasterDetailPageController)e.OldElement).BackButtonPressed -= HandleBackButtonPressed;
if (e.NewElement != null)
- e.NewElement.BackButtonPressed += HandleBackButtonPressed;
+ ((IMasterDetailPageController)e.NewElement).BackButtonPressed += HandleBackButtonPressed;
LoadDetail();
LoadMaster();
@@ -170,8 +172,8 @@ namespace Xamarin.Forms.Platform.WinPhone
var platform = Element.Platform as Platform;
Size screenSize = platform.Size;
- Element.MasterBounds = new Rectangle(0, 0, screenSize.Width - 20, screenSize.Height - 20);
- Element.DetailBounds = new Rectangle(0, 0, width, height);
+ MasterDetailPageController.MasterBounds = new Rectangle(0, 0, screenSize.Width - 20, screenSize.Height - 20);
+ MasterDetailPageController.DetailBounds = new Rectangle(0, 0, width, height);
_popup.Width = width - 20;
_popup.Height = height - 20;
diff --git a/Xamarin.Forms.Platform.WinRT/MasterDetailPageRenderer.cs b/Xamarin.Forms.Platform.WinRT/MasterDetailPageRenderer.cs
index 314cc794..87b8cd7e 100644
--- a/Xamarin.Forms.Platform.WinRT/MasterDetailPageRenderer.cs
+++ b/Xamarin.Forms.Platform.WinRT/MasterDetailPageRenderer.cs
@@ -55,6 +55,8 @@ namespace Xamarin.Forms.Platform.WinRT
set { _container.ToolbarForeground = value; }
}
+ IMasterDetailPageController MasterDetailPageController => Element as IMasterDetailPageController;
+
bool ITitleProvider.ShowTitle
{
get { return _showTitle; }
@@ -166,7 +168,7 @@ namespace Xamarin.Forms.Platform.WinRT
bool GetIsMasterAPopover()
{
// TODO: Support tablet being shrunk to a very small size
- return !Element.ShouldShowSplitMode;
+ return !MasterDetailPageController.ShouldShowSplitMode;
}
void OnLoaded(object sender, RoutedEventArgs args)
@@ -266,8 +268,8 @@ namespace Xamarin.Forms.Platform.WinRT
if (!isPopover)
detailWidth -= masterWidth;
- Element.MasterBounds = new Rectangle(0, 0, masterWidth, constraint.Height);
- Element.DetailBounds = new Rectangle(0, 0, detailWidth, constraint.Height);
+ MasterDetailPageController.MasterBounds = new Rectangle(0, 0, masterWidth, constraint.Height);
+ MasterDetailPageController.DetailBounds = new Rectangle(0, 0, detailWidth, constraint.Height);
}
void UpdateIsPresented()
diff --git a/Xamarin.Forms.Platform.iOS/Renderers/PhoneMasterDetailRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/PhoneMasterDetailRenderer.cs
index dcefbcf6..e4c73521 100644
--- a/Xamarin.Forms.Platform.iOS/Renderers/PhoneMasterDetailRenderer.cs
+++ b/Xamarin.Forms.Platform.iOS/Renderers/PhoneMasterDetailRenderer.cs
@@ -43,6 +43,8 @@ namespace Xamarin.Forms.Platform.iOS
WantsFullScreenLayout = true;
}
+ IMasterDetailPageController MasterDetailPageController => Element as IMasterDetailPageController;
+
bool Presented
{
get { return _presented; }
@@ -153,7 +155,7 @@ namespace Xamarin.Forms.Platform.iOS
public override void WillRotate(UIInterfaceOrientation toInterfaceOrientation, double duration)
{
- if (!((MasterDetailPage)Element).ShouldShowSplitMode && _presented)
+ if (!MasterDetailPageController.ShouldShowSplitMode && _presented)
Presented = false;
base.WillRotate(toInterfaceOrientation, duration);
@@ -270,8 +272,8 @@ namespace Xamarin.Forms.Platform.iOS
else
_detailController.View.Frame = target;
- ((MasterDetailPage)Element).MasterBounds = new Rectangle(0, 0, masterFrame.Width, masterFrame.Height);
- ((MasterDetailPage)Element).DetailBounds = new Rectangle(0, 0, frame.Width, frame.Height);
+ MasterDetailPageController.MasterBounds = new Rectangle(0, 0, masterFrame.Width, masterFrame.Height);
+ MasterDetailPageController.DetailBounds = new Rectangle(0, 0, frame.Width, frame.Height);
if (Presented)
_clickOffView.Frame = _detailController.View.Frame;
diff --git a/Xamarin.Forms.Platform.iOS/Renderers/TabletMasterDetailRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/TabletMasterDetailRenderer.cs
index e7c92dfa..e49ed5ae 100644
--- a/Xamarin.Forms.Platform.iOS/Renderers/TabletMasterDetailRenderer.cs
+++ b/Xamarin.Forms.Platform.iOS/Renderers/TabletMasterDetailRenderer.cs
@@ -64,6 +64,8 @@ namespace Xamarin.Forms.Platform.iOS
get { return _masterDetailPage ?? (_masterDetailPage = (MasterDetailPage)Element); }
}
+ IMasterDetailPageController MasterDetailPageController => MasterDetailPage as IMasterDetailPageController;
+
UIBarButtonItem PresentButton
{
get { return _innerDelegate == null ? null : _innerDelegate.PresentButton; }
@@ -175,10 +177,10 @@ namespace Xamarin.Forms.Platform.iOS
var masterBounds = _masterController.View.Frame;
if (!masterBounds.IsEmpty)
- MasterDetailPage.MasterBounds = new Rectangle(0, 0, masterBounds.Width, masterBounds.Height);
+ MasterDetailPageController.MasterBounds = new Rectangle(0, 0, masterBounds.Width, masterBounds.Height);
if (!detailsBounds.IsEmpty)
- MasterDetailPage.DetailBounds = new Rectangle(0, 0, detailsBounds.Width, detailsBounds.Height);
+ MasterDetailPageController.DetailBounds = new Rectangle(0, 0, detailsBounds.Width, detailsBounds.Height);
}
public override void ViewDidLoad()
@@ -208,16 +210,17 @@ namespace Xamarin.Forms.Platform.iOS
{
// On IOS8 the MasterViewController ViewAppear/Disappear weren't being called correctly after rotation
// We now close the Master by using the new SplitView API, basicly we set it to hidden and right back to the Normal/AutomaticMode
- if (!MasterDetailPage.ShouldShowSplitMode && _masterVisible)
+ if (!MasterDetailPageController.ShouldShowSplitMode && _masterVisible)
{
- MasterDetailPage.CanChangeIsPresented = true;
+ MasterDetailPageController.CanChangeIsPresented = true;
if (Forms.IsiOS8OrNewer)
{
PreferredDisplayMode = UISplitViewControllerDisplayMode.PrimaryHidden;
PreferredDisplayMode = UISplitViewControllerDisplayMode.Automatic;
}
}
- MasterDetailPage.UpdateMasterBehavior(MasterDetailPage);
+
+ MasterDetailPageController.UpdateMasterBehavior();
MessagingCenter.Send<IVisualElementRenderer>(this, NavigationRenderer.UpdateToolbarButtons);
base.WillRotate(toInterfaceOrientation, duration);
}
@@ -273,14 +276,14 @@ namespace Xamarin.Forms.Platform.iOS
void MasterControllerWillAppear(object sender, EventArgs e)
{
_masterVisible = true;
- if (MasterDetailPage.CanChangeIsPresented)
+ if (MasterDetailPageController.CanChangeIsPresented)
((IElementController)Element).SetValueFromRenderer(MasterDetailPage.IsPresentedProperty, true);
}
void MasterControllerWillDisappear(object sender, EventArgs e)
{
_masterVisible = false;
- if (MasterDetailPage.CanChangeIsPresented)
+ if (MasterDetailPageController.CanChangeIsPresented)
((IElementController)Element).SetValueFromRenderer(MasterDetailPage.IsPresentedProperty, false);
}
@@ -294,7 +297,7 @@ namespace Xamarin.Forms.Platform.iOS
void ToggleMaster()
{
- if (_masterVisible == MasterDetailPage.IsPresented || MasterDetailPage.ShouldShowSplitMode)
+ if (_masterVisible == MasterDetailPage.IsPresented || MasterDetailPageController.ShouldShowSplitMode)
return;
PerformButtonSelector();
diff --git a/docs/Xamarin.Forms.Core/Xamarin.Forms/IMasterDetailPageController.xml b/docs/Xamarin.Forms.Core/Xamarin.Forms/IMasterDetailPageController.xml
new file mode 100644
index 00000000..aad70699
--- /dev/null
+++ b/docs/Xamarin.Forms.Core/Xamarin.Forms/IMasterDetailPageController.xml
@@ -0,0 +1,110 @@
+<Type Name="IMasterDetailPageController" FullName="Xamarin.Forms.IMasterDetailPageController">
+ <TypeSignature Language="C#" Value="public interface IMasterDetailPageController" />
+ <TypeSignature Language="ILAsm" Value=".class public interface auto ansi abstract IMasterDetailPageController" />
+ <AssemblyInfo>
+ <AssemblyName>Xamarin.Forms.Core</AssemblyName>
+ <AssemblyVersion>2.0.0.0</AssemblyVersion>
+ </AssemblyInfo>
+ <Interfaces />
+ <Docs>
+ <summary>To be added.</summary>
+ <remarks>To be added.</remarks>
+ </Docs>
+ <Members>
+ <Member MemberName="BackButtonPressed">
+ <MemberSignature Language="C#" Value="public event EventHandler&lt;Xamarin.Forms.BackButtonPressedEventArgs&gt; BackButtonPressed;" />
+ <MemberSignature Language="ILAsm" Value=".event class System.EventHandler`1&lt;class Xamarin.Forms.BackButtonPressedEventArgs&gt; BackButtonPressed" />
+ <MemberType>Event</MemberType>
+ <AssemblyInfo>
+ <AssemblyVersion>2.0.0.0</AssemblyVersion>
+ </AssemblyInfo>
+ <ReturnValue>
+ <ReturnType>System.EventHandler&lt;Xamarin.Forms.BackButtonPressedEventArgs&gt;</ReturnType>
+ </ReturnValue>
+ <Docs>
+ <summary>To be added.</summary>
+ <remarks>To be added.</remarks>
+ </Docs>
+ </Member>
+ <Member MemberName="CanChangeIsPresented">
+ <MemberSignature Language="C#" Value="public bool CanChangeIsPresented { get; set; }" />
+ <MemberSignature Language="ILAsm" Value=".property instance bool CanChangeIsPresented" />
+ <MemberType>Property</MemberType>
+ <AssemblyInfo>
+ <AssemblyVersion>2.0.0.0</AssemblyVersion>
+ </AssemblyInfo>
+ <ReturnValue>
+ <ReturnType>System.Boolean</ReturnType>
+ </ReturnValue>
+ <Docs>
+ <summary>To be added.</summary>
+ <value>To be added.</value>
+ <remarks>To be added.</remarks>
+ </Docs>
+ </Member>
+ <Member MemberName="DetailBounds">
+ <MemberSignature Language="C#" Value="public Xamarin.Forms.Rectangle DetailBounds { get; set; }" />
+ <MemberSignature Language="ILAsm" Value=".property instance valuetype Xamarin.Forms.Rectangle DetailBounds" />
+ <MemberType>Property</MemberType>
+ <AssemblyInfo>
+ <AssemblyVersion>2.0.0.0</AssemblyVersion>
+ </AssemblyInfo>
+ <ReturnValue>
+ <ReturnType>Xamarin.Forms.Rectangle</ReturnType>
+ </ReturnValue>
+ <Docs>
+ <summary>To be added.</summary>
+ <value>To be added.</value>
+ <remarks>To be added.</remarks>
+ </Docs>
+ </Member>
+ <Member MemberName="MasterBounds">
+ <MemberSignature Language="C#" Value="public Xamarin.Forms.Rectangle MasterBounds { get; set; }" />
+ <MemberSignature Language="ILAsm" Value=".property instance valuetype Xamarin.Forms.Rectangle MasterBounds" />
+ <MemberType>Property</MemberType>
+ <AssemblyInfo>
+ <AssemblyVersion>2.0.0.0</AssemblyVersion>
+ </AssemblyInfo>
+ <ReturnValue>
+ <ReturnType>Xamarin.Forms.Rectangle</ReturnType>
+ </ReturnValue>
+ <Docs>
+ <summary>To be added.</summary>
+ <value>To be added.</value>
+ <remarks>To be added.</remarks>
+ </Docs>
+ </Member>
+ <Member MemberName="ShouldShowSplitMode">
+ <MemberSignature Language="C#" Value="public bool ShouldShowSplitMode { get; }" />
+ <MemberSignature Language="ILAsm" Value=".property instance bool ShouldShowSplitMode" />
+ <MemberType>Property</MemberType>
+ <AssemblyInfo>
+ <AssemblyVersion>2.0.0.0</AssemblyVersion>
+ </AssemblyInfo>
+ <ReturnValue>
+ <ReturnType>System.Boolean</ReturnType>
+ </ReturnValue>
+ <Docs>
+ <summary>To be added.</summary>
+ <value>To be added.</value>
+ <remarks>To be added.</remarks>
+ </Docs>
+ </Member>
+ <Member MemberName="UpdateMasterBehavior">
+ <MemberSignature Language="C#" Value="public void UpdateMasterBehavior ();" />
+ <MemberSignature Language="ILAsm" Value=".method public hidebysig newslot virtual instance void UpdateMasterBehavior() cil managed" />
+ <MemberType>Method</MemberType>
+ <AssemblyInfo>
+ <AssemblyVersion>2.0.0.0</AssemblyVersion>
+ </AssemblyInfo>
+ <ReturnValue>
+ <ReturnType>System.Void</ReturnType>
+ </ReturnValue>
+ <Parameters />
+ <Docs>
+ <summary>To be added.</summary>
+ <remarks>To be added.</remarks>
+ </Docs>
+ </Member>
+ </Members>
+</Type>
diff --git a/docs/Xamarin.Forms.Core/Xamarin.Forms/MasterDetailPage.xml b/docs/Xamarin.Forms.Core/Xamarin.Forms/MasterDetailPage.xml
index 81d1ef3e..5c802650 100644
--- a/docs/Xamarin.Forms.Core/Xamarin.Forms/MasterDetailPage.xml
+++ b/docs/Xamarin.Forms.Core/Xamarin.Forms/MasterDetailPage.xml
@@ -1,6 +1,6 @@
<Type Name="MasterDetailPage" FullName="Xamarin.Forms.MasterDetailPage">
- <TypeSignature Language="C#" Value="public class MasterDetailPage : Xamarin.Forms.Page" />
- <TypeSignature Language="ILAsm" Value=".class public auto ansi beforefieldinit MasterDetailPage extends Xamarin.Forms.Page" />
+ <TypeSignature Language="C#" Value="public class MasterDetailPage : Xamarin.Forms.Page, Xamarin.Forms.IMasterDetailPageController" />
+ <TypeSignature Language="ILAsm" Value=".class public auto ansi beforefieldinit MasterDetailPage extends Xamarin.Forms.Page implements class Xamarin.Forms.IMasterDetailPageController" />
<AssemblyInfo>
<AssemblyName>Xamarin.Forms.Core</AssemblyName>
<AssemblyVersion>1.0.0.0</AssemblyVersion>
@@ -14,7 +14,11 @@
<Base>
<BaseTypeName>Xamarin.Forms.Page</BaseTypeName>
</Base>
- <Interfaces />
+ <Interfaces>
+ <Interface>
+ <InterfaceName>Xamarin.Forms.IMasterDetailPageController</InterfaceName>
+ </Interface>
+ </Interfaces>
<Attributes>
<Attribute>
<AttributeName>Xamarin.Forms.RenderWith(typeof(Xamarin.Forms.Platform._MasterDetailPageRenderer))</AttributeName>
@@ -462,5 +466,85 @@ namespace FormsGallery
<remarks>To be added.</remarks>
</Docs>
</Member>
+ <Member MemberName="Xamarin.Forms.IMasterDetailPageController.CanChangeIsPresented">
+ <MemberSignature Language="C#" Value="bool Xamarin.Forms.IMasterDetailPageController.CanChangeIsPresented { get; set; }" />
+ <MemberSignature Language="ILAsm" Value=".property instance bool Xamarin.Forms.IMasterDetailPageController.CanChangeIsPresented" />
+ <MemberType>Property</MemberType>
+ <AssemblyInfo>
+ <AssemblyVersion>2.0.0.0</AssemblyVersion>
+ </AssemblyInfo>
+ <ReturnValue>
+ <ReturnType>System.Boolean</ReturnType>
+ </ReturnValue>
+ <Docs>
+ <summary>To be added.</summary>
+ <value>To be added.</value>
+ <remarks>To be added.</remarks>
+ </Docs>
+ </Member>
+ <Member MemberName="Xamarin.Forms.IMasterDetailPageController.DetailBounds">
+ <MemberSignature Language="C#" Value="Xamarin.Forms.Rectangle Xamarin.Forms.IMasterDetailPageController.DetailBounds { get; set; }" />
+ <MemberSignature Language="ILAsm" Value=".property instance valuetype Xamarin.Forms.Rectangle Xamarin.Forms.IMasterDetailPageController.DetailBounds" />
+ <MemberType>Property</MemberType>
+ <AssemblyInfo>
+ <AssemblyVersion>2.0.0.0</AssemblyVersion>
+ </AssemblyInfo>
+ <ReturnValue>
+ <ReturnType>Xamarin.Forms.Rectangle</ReturnType>
+ </ReturnValue>
+ <Docs>
+ <summary>To be added.</summary>
+ <value>To be added.</value>
+ <remarks>To be added.</remarks>
+ </Docs>
+ </Member>
+ <Member MemberName="Xamarin.Forms.IMasterDetailPageController.MasterBounds">
+ <MemberSignature Language="C#" Value="Xamarin.Forms.Rectangle Xamarin.Forms.IMasterDetailPageController.MasterBounds { get; set; }" />
+ <MemberSignature Language="ILAsm" Value=".property instance valuetype Xamarin.Forms.Rectangle Xamarin.Forms.IMasterDetailPageController.MasterBounds" />
+ <MemberType>Property</MemberType>
+ <AssemblyInfo>
+ <AssemblyVersion>2.0.0.0</AssemblyVersion>
+ </AssemblyInfo>
+ <ReturnValue>
+ <ReturnType>Xamarin.Forms.Rectangle</ReturnType>
+ </ReturnValue>
+ <Docs>
+ <summary>To be added.</summary>
+ <value>To be added.</value>
+ <remarks>To be added.</remarks>
+ </Docs>
+ </Member>
+ <Member MemberName="Xamarin.Forms.IMasterDetailPageController.ShouldShowSplitMode">
+ <MemberSignature Language="C#" Value="bool Xamarin.Forms.IMasterDetailPageController.ShouldShowSplitMode { get; }" />
+ <MemberSignature Language="ILAsm" Value=".property instance bool Xamarin.Forms.IMasterDetailPageController.ShouldShowSplitMode" />
+ <MemberType>Property</MemberType>
+ <AssemblyInfo>
+ <AssemblyVersion>2.0.0.0</AssemblyVersion>
+ </AssemblyInfo>
+ <ReturnValue>
+ <ReturnType>System.Boolean</ReturnType>
+ </ReturnValue>
+ <Docs>
+ <summary>To be added.</summary>
+ <value>To be added.</value>
+ <remarks>To be added.</remarks>
+ </Docs>
+ </Member>
+ <Member MemberName="Xamarin.Forms.IMasterDetailPageController.UpdateMasterBehavior">
+ <MemberSignature Language="C#" Value="void IMasterDetailPageController.UpdateMasterBehavior ();" />
+ <MemberSignature Language="ILAsm" Value=".method hidebysig newslot virtual instance void Xamarin.Forms.IMasterDetailPageController.UpdateMasterBehavior() cil managed" />
+ <MemberType>Method</MemberType>
+ <AssemblyInfo>
+ <AssemblyVersion>2.0.0.0</AssemblyVersion>
+ </AssemblyInfo>
+ <ReturnValue>
+ <ReturnType>System.Void</ReturnType>
+ </ReturnValue>
+ <Parameters />
+ <Docs>
+ <summary>To be added.</summary>
+ <remarks>To be added.</remarks>
+ </Docs>
+ </Member>
</Members>
</Type>