diff options
author | E.Z. Hart <hartez@users.noreply.github.com> | 2016-05-04 08:22:34 -0600 |
---|---|---|
committer | Rui Marinho <me@ruimarinho.net> | 2016-05-04 15:22:34 +0100 |
commit | a8acdcc11793c9f44098f2cd478d51677d742945 (patch) | |
tree | 811cf1ee2e2ff0baa8674f116b6b5c08590f56cf | |
parent | 8d383746caab00dd3ee0b62dc992a2a99c7a6d06 (diff) | |
download | xamarin-forms-a8acdcc11793c9f44098f2cd478d51677d742945.tar.gz xamarin-forms-a8acdcc11793c9f44098f2cd478d51677d742945.tar.bz2 xamarin-forms-a8acdcc11793c9f44098f2cd478d51677d742945.zip |
Add IMasterDetailPageController and update renderers (#146)
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<Xamarin.Forms.BackButtonPressedEventArgs> BackButtonPressed;" /> + <MemberSignature Language="ILAsm" Value=".event class System.EventHandler`1<class Xamarin.Forms.BackButtonPressedEventArgs> BackButtonPressed" /> + <MemberType>Event</MemberType> + <AssemblyInfo> + <AssemblyVersion>2.0.0.0</AssemblyVersion> + </AssemblyInfo> + <ReturnValue> + <ReturnType>System.EventHandler<Xamarin.Forms.BackButtonPressedEventArgs></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> |